如何在Android中发送POST请求而不使用AsyncTask。

huangapple go评论125阅读模式
英文:

How to send a post request in Android without using AsyncTask

问题

这是我需要异步调用的整个类:

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedReader;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.UnsupportedEncodingException;
  8. import java.net.HttpURLConnection;
  9. import java.net.MalformedURLException;
  10. import java.net.ProtocolException;
  11. import java.net.URL;
  12. import java.net.URLEncoder;
  13. import java.util.HashMap;
  14. public class ServerConnection {
  15. private String absoluteUrl;
  16. String parameters;
  17. public ServerConnection(String postUrl, HashMap<String, String> keyValuePairs)
  18. {
  19. absoluteUrl = postUrl;
  20. StringBuilder sbParams = new StringBuilder();
  21. int i = 0;
  22. for (String key : keyValuePairs.keySet()) {
  23. try {
  24. if (i != 0){
  25. sbParams.append("&");
  26. }
  27. sbParams.append(key).append("=")
  28. .append(URLEncoder.encode(keyValuePairs.get(key), "UTF-8"));
  29. } catch (UnsupportedEncodingException e) {
  30. e.printStackTrace();
  31. }
  32. i++;
  33. }
  34. parameters = sbParams.toString();
  35. }
  36. public boolean Send()
  37. {
  38. HttpURLConnection conn = null;
  39. try {
  40. URL urlObj = new URL(absoluteUrl);
  41. conn = (HttpURLConnection) urlObj.openConnection();
  42. conn.setDoOutput(true);
  43. conn.setRequestMethod("POST");
  44. conn.setRequestProperty("Accept-Charset", "UTF-8");
  45. conn.setReadTimeout(10000);
  46. conn.setConnectTimeout(15000);
  47. conn.connect();
  48. DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
  49. wr.writeBytes(parameters);
  50. wr.flush();
  51. wr.close();
  52. InputStream in = new BufferedInputStream(conn.getInputStream());
  53. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  54. StringBuilder result = new StringBuilder();
  55. String line;
  56. while ((line = reader.readLine()) != null) {
  57. result.append(line);
  58. }
  59. return result.toString().equals("OK");
  60. } catch (MalformedURLException e) {
  61. e.printStackTrace();
  62. return false;
  63. } catch (ProtocolException e) {
  64. e.printStackTrace();
  65. return false;
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. return false;
  69. } finally {
  70. if (conn != null) {
  71. conn.disconnect();
  72. }
  73. }
  74. }
  75. }

此外,这是一个我将在iOS应用程序中调用的库项目,这就是为什么我正在寻找一种标准的Java方式。

谢谢
Jaime

英文:

I am doing a post request to a server using HttpURLConnection but I got an exception that this cannot be made on UI Thread.

I was looking for information but I have only found information using AsyncTask class, but according to Android documentation, this class is deprecated and I should use java.util.concurrent instead.

I have found many information (for example, a complete HttpClient class or to use external libraries) but none of that does a simple thing to send a post request to an URL.

Can you point me to the right direction?

This is my whole class that I need to call asynchronously:

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedReader;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.UnsupportedEncodingException;
  8. import java.net.HttpURLConnection;
  9. import java.net.MalformedURLException;
  10. import java.net.ProtocolException;
  11. import java.net.URL;
  12. import java.net.URLEncoder;
  13. import java.util.HashMap;
  14. public class ServerConnection {
  15. private String absoluteUrl;
  16. String parameters;
  17. public ServerConnection(String postUrl, HashMap&lt;String, String&gt; keyValuePairs)
  18. {
  19. absoluteUrl = postUrl;
  20. StringBuilder sbParams = new StringBuilder();
  21. int i = 0;
  22. for (String key : keyValuePairs.keySet()) {
  23. try {
  24. if (i != 0){
  25. sbParams.append(&quot;&amp;&quot;);
  26. }
  27. sbParams.append(key).append(&quot;=&quot;)
  28. .append(URLEncoder.encode(keyValuePairs.get(key), &quot;UTF-8&quot;));
  29. } catch (UnsupportedEncodingException e) {
  30. e.printStackTrace();
  31. }
  32. i++;
  33. }
  34. parameters = sbParams.toString();
  35. }
  36. public boolean Send()
  37. {
  38. HttpURLConnection conn = null;
  39. try {
  40. URL urlObj = new URL(absoluteUrl);
  41. conn = (HttpURLConnection) urlObj.openConnection();
  42. conn.setDoOutput(true);
  43. conn.setRequestMethod(&quot;POST&quot;);
  44. conn.setRequestProperty(&quot;Accept-Charset&quot;, &quot;UTF-8&quot;);
  45. conn.setReadTimeout(10000);
  46. conn.setConnectTimeout(15000);
  47. conn.connect();
  48. DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
  49. wr.writeBytes(parameters);
  50. wr.flush();
  51. wr.close();
  52. InputStream in = new BufferedInputStream(conn.getInputStream());
  53. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  54. StringBuilder result = new StringBuilder();
  55. String line;
  56. while ((line = reader.readLine()) != null) {
  57. result.append(line);
  58. }
  59. return result.toString().equals(&quot;OK&quot;);
  60. } catch (MalformedURLException e) {
  61. e.printStackTrace();
  62. return false;
  63. } catch (ProtocolException e) {
  64. e.printStackTrace();
  65. return false;
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. return false;
  69. } finally {
  70. if (conn != null) {
  71. conn.disconnect();
  72. }
  73. }
  74. }
  75. }

Furthermore, this is a lib project I will call for the iOS application as well, that is why I am looking for a standar java way.

Thanks
Jaime

答案1

得分: 0

根据文档,AsyncTask 现在已经被弃用,你需要使用 java.util.concurrent 替代。这里有一个有用的库叫做 ObservableScheduler,它让你可以使用 java.util.concurrent

  1. implementation 'com.jiang.android.observablescheduler:schedule:1.0.1';

示例:

  1. public void send() {
  2. JObservable.create(new JObservable.OnSubscribe<StringBuilder>() {
  3. @Override
  4. public void call(SubscribeManager<StringBuilder> mSubscriber) {
  5. try {
  6. HttpURLConnection conn = null;
  7. URL urlObj = new URL(absoluteUrl);
  8. conn = (HttpURLConnection) urlObj.openConnection();
  9. conn.setDoOutput(true);
  10. conn.setRequestMethod("POST");
  11. conn.setRequestProperty("Accept-Charset", "UTF-8");
  12. conn.setReadTimeout(10000);
  13. conn.setConnectTimeout(15000);
  14. conn.connect();
  15. DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
  16. wr.writeBytes(parameters);
  17. wr.flush();
  18. wr.close();
  19. InputStream in = new BufferedInputStream(conn.getInputStream());
  20. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  21. StringBuilder result = new StringBuilder();
  22. String line;
  23. while ((line = reader.readLine()) != null) {
  24. result.append(line);
  25. }
  26. mSubscriber.notifyData(result);
  27. } catch (Exception e) {
  28. mSubscriber.error(e);
  29. }
  30. }
  31. }).workedOn(Schedules.background())
  32. .subscribeOn(Schedules.mainThread())
  33. .subscribe(new Subscriber<StringBuilder>() {
  34. @Override
  35. public void notifyData(StringBuilder result) {
  36. // 在这里进行你的操作
  37. }
  38. @Override
  39. public void error(Throwable t) {
  40. Toast.makeText(context, "Ops ! " + t.getMessage(), Toast.LENGTH_SHORT).show();
  41. }
  42. });
  43. }
英文:

As the documentation said AsyncTask is deprecated now, and you need to use java.util.concurrent instead, here's a helpful library called ObservableScheduler let you use java.util.concurrent:

  1. implementation &#39;com.jiang.android.observablescheduler:schedule:1.0.1&#39;

Example :

  1. public void send() {
  2. JObservable.create(new JObservable.OnSubscribe&lt;StringBuilder&gt;() {
  3. @Override
  4. public void call(SubscribeManager&lt;StringBuilder&gt; mSubscriber) {
  5. try {
  6. HttpURLConnection conn = null;
  7. URL urlObj = new URL(absoluteUrl);
  8. conn = (HttpURLConnection) urlObj.openConnection();
  9. conn.setDoOutput(true);
  10. conn.setRequestMethod(&quot;POST&quot;);
  11. conn.setRequestProperty(&quot;Accept-Charset&quot;, &quot;UTF-8&quot;);
  12. conn.setReadTimeout(10000);
  13. conn.setConnectTimeout(15000);
  14. conn.connect();
  15. DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
  16. wr.writeBytes(parameters);
  17. wr.flush();
  18. wr.close();
  19. InputStream in = new BufferedInputStream(conn.getInputStream());
  20. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  21. StringBuilder result = new StringBuilder();
  22. String line;
  23. while ((line = reader.readLine()) != null) {
  24. result.append(line);
  25. }
  26. mSubscriber.notifyData(result);
  27. } catch (Exception e) {
  28. mSubscriber.error(e);
  29. }
  30. }
  31. }).workedOn(Schedules.background())
  32. .subscribeOn(Schedules.mainThread())
  33. .subscribe(new Subscriber&lt;StringBuilder&gt;() {
  34. @Override
  35. public void notifyData(StringBuilder result) {
  36. //DO YOUR STUFF HERE
  37. }
  38. @Override
  39. public void error(Throwable t) {
  40. Toast.makeText(context, &quot;Ops ! &quot; + t.getMessage(), Toast.LENGTH_SHORT).show();
  41. }
  42. });
  43. }

答案2

得分: 0

我刚刚创建了一个 Thread 对象,并在 run 方法中添加了我的连接代码。

英文:

I have just created a Thread object and I added my connection code inside the run method.

huangapple
  • 本文由 发表于 2020年8月25日 05:35:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/63569009.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定