【问题标题】:Android: AsyncTask to make an HTTP GET Request?Android:AsyncTask 发出 HTTP GET 请求?
【发布时间】:2014-08-15 11:06:47
【问题描述】:

我是 Android 开发新手。我的问题是,我是否使用 AsyncTask 来发出 HTTP GET 请求(JSON 响应)?它是否正确?如果这确实是真的,有谁知道我在哪里可以看到这个例子?如果没有,你能纠正我吗?谢谢!

【问题讨论】:

标签: android android-asynctask httprequest


【解决方案1】:

这是以json形式进行post请求和请求服务器的代码。

{"emailId":"test123@gmail.com","emailIdOTP":"123456","phoneNo":"1111111111"}

异步任务:

public class GetAsynTask extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... params) {

            try {
                // Creating & connection Connection with url and required Header.
                URL url = new URL(JWT_URL);
                HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
                urlConnection.setRequestProperty("Content-Type", "application/json");
                urlConnection.setRequestMethod("POST");   //POST or GET
                urlConnection.connect();

                // Create JSONObject Request
                JSONObject jsonRequest = new JSONObject();
                jsonRequest.put("emailId", "test123@gmail.com");
                jsonRequest.put("emailIdOTP", "123456");
                jsonRequest.put("phoneNo", "1111111111");


                // Write Request to output stream to server.
                OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
                out.write(jsonRequest.toString());
                out.close();

                // Check the connection status.
                int statusCode = urlConnection.getResponseCode();

                // Connection success. Proceed to fetch the response.
                if (statusCode == 200) {
                    InputStream it = new BufferedInputStream(urlConnection.getInputStream());
                    InputStreamReader read = new InputStreamReader(it);
                    BufferedReader buff = new BufferedReader(read);
                    StringBuilder dta = new StringBuilder();
                    String chunks;
                    while ((chunks = buff.readLine()) != null) {
                        dta.append(chunks);
                    }
                    String returndata = dta.toString();
                    return returndata;
                } else {
                    Toast.makeText(SplashActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String resultData) {
            super.onPostExecute(resultData);
            try {
                JSONObject obj = new JSONObject(resultData);
               String name= obj.getString("name");
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

【讨论】:

    【解决方案2】:

    是的,你有 3 个选择

    1. 使用AsyncTask
    2. 您可以使用Handler
    3. 或者您可以使用seperate Thread

    最好的选择是 AsyncTask。您必须在AsyncTaskdoInBackground 方法中实现您的network call,并在postExecute 方法中更新UI 或任何您想要对结果执行的操作。

    你可以关注follow this tutorial for your requirement

    代码sn-p

    @Override
        protected String doInBackground(String... urls) {
          String response = "";
          for (String url : urls) {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            try {
              HttpResponse execute = client.execute(httpGet);
              InputStream content = execute.getEntity().getContent();
    
              BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
              String s = "";
              while ((s = buffer.readLine()) != null) {
                response += s;
              }
    
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
          return response;
        }
    

    注意:由于DefaultHttpClient已被弃用,您可以使用HttpClientBuilder

    【讨论】:

      【解决方案3】:

      AsyncTask 确实管理它的线程池,但它没有针对网络活动进行优化。实际上,如果您对同一台服务器有许多 HTTP 请求,那么无论从内存消耗还是整体性能来看,最好将它们保持在同一个线程上,并尽可能重用持久连接。 AsyncTask 不考虑此类问题。

      与其伪造您自己的异步 HTTP 客户端,不如考虑使用为数不多的可用库之一。一些聪明的人投入了很多心思来使这些强大、灵活和快速。

      【讨论】:

      • 有哪些可用的异步 HTTP 客户端库?我开始实施一个,但认为我正在重新发明轮子。
      • @GregoryStein 你可以先在谷歌搜索框中输入这个问题。如果与您相关,请添加“android”一词。
      • 有很多类似retrofitionvolleyokhttp
      【解决方案4】:

      这是用于 Https POST/GET web-API 调用的 ASyncTask 类中的简单 HttpsURLConnection 以及包头和正文中的 JSONObject

      import android.os.AsyncTask;
      
      import org.json.JSONObject;
      
      import java.io.BufferedInputStream;
      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.io.OutputStreamWriter;
      import java.net.MalformedURLException;
      import java.net.ProtocolException;
      import java.net.URL;
      
      import javax.net.ssl.HttpsURLConnection;
      
      /**
       * Class to handle BasicAuth post web-api call.
       */
      public class Information extends AsyncTask<String, String, String> {
      
          @Override
          protected String doInBackground(String... params) {
      
              try {
                  // Creating & connection Connection with url and required Header.
                  URL url = new URL("https://example.com/wp-json/jwt-auth/v1/token");
                  HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
                  urlConnection.setRequestProperty("Content-Type", "application/json");
                  urlConnection.setRequestProperty("header-param_3", "value-3");
                  urlConnection.setRequestProperty("header-param_4", "value-4");
                  urlConnection.setRequestProperty("Authorization", "Basic Y2tfNDIyODg0NWI1YmZiZT1234ZjZWNlOTA3ZDYyZjI4MDMxY2MyNmZkZjpjc181YjdjYTY5ZGM0OTUwODE3NzYwMWJhMmQ2OGQ0YTY3Njk1ZGYwYzcw");
                  urlConnection.setRequestMethod("POST");   //POST or GET
                  urlConnection.connect();
      
                  // Create JSONObject Request
                  JSONObject jsonRequest = new JSONObject();
                  jsonRequest.put("username", "user.name");
                  jsonRequest.put("password", "pass@123");
      
                  // Write Request to output stream to server.
                  OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
                  out.write(jsonRequest.toString());
                  out.close();
      
                  // Check the connection status.
                  int statusCode = urlConnection.getResponseCode();
                  String statusMsg = urlConnection.getResponseMessage();
      
                  // Connection success. Proceed to fetch the response.
                  if (statusCode == 200) {
                      InputStream it = new BufferedInputStream(urlConnection.getInputStream());
                      InputStreamReader read = new InputStreamReader(it);
                      BufferedReader buff = new BufferedReader(read);
                      StringBuilder dta = new StringBuilder();
                      String chunks;
                      while ((chunks = buff.readLine()) != null) {
                          dta.append(chunks);
                      }
                      String returndata = dta.toString();
                      return returndata;
                  } else {
                      //Handle else case
                  }
              } catch (ProtocolException e) {
                  e.printStackTrace();
              } catch (MalformedURLException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              } catch (Exception e) {
                  e.printStackTrace();
              }
      
              return null;
          }
      
      }
      

      这里Authentication(标头参数)的值是[API-key]:[API-Secret]Base64编码值,在开头附加了"Basic "字符串。

      在 Android Studio 中,将 Gradle 条目用作:

      compile 'org.apache.httpcomponents:httpcore:4.4.1'
      compile 'org.apache.httpcomponents:httpclient:4.5'
      

      【讨论】:

        【解决方案5】:
        protected String doInBackground(String... strings) {
        
            String response = "";
        
            response = ServiceHandler.findJSONFromUrl("url");
            data = response;
            return response;
        }
        
        public class ServiceHandler {
        
            // Create Http connection And find Json
        
            public static String findJSONFromUrl(String url) {
                String result = "";
                try {
                    URL urls = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
                    conn.setReadTimeout(150000); //milliseconds
                    conn.setConnectTimeout(15000); // milliseconds
                    conn.setRequestMethod("GET");
        
                    conn.connect();
        
                    if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
        
                        BufferedReader reader = new BufferedReader(new InputStreamReader(
                                conn.getInputStream(), "iso-8859-1"), 8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
        
                        }
                        result = sb.toString();
                    } else {
        
                        return "error";
                    }
        
        
                } catch (Exception e) {
                    // System.out.println("exception in jsonparser class ........");
                    e.printStackTrace();
                    return "error";
                }
        
                return result;
            } // method ends
        }
        

        【讨论】:

          【解决方案6】:

          查看LINK 和来自google 的电子邮件this one good too

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.InputStreamReader;
          import java.io.UnsupportedEncodingException;
          import org.apache.http.HttpEntity;
          import org.apache.http.HttpResponse;
          import org.apache.http.client.ClientProtocolException;
          import org.apache.http.client.methods.HttpPost;
          import org.apache.http.impl.client.DefaultHttpClient;
          import org.json.JSONException;
          import org.json.JSONObject;
          import android.util.Log;
          public class JSONParser {
            static InputStream is = null;
            static JSONObject jObj = null;
            static String json = "";
            // constructor
            public JSONParser() {
            }
            public JSONObject getJSONFromUrl(String url) {
              // Making HTTP request
              try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
              } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
              } catch (ClientProtocolException e) {
                e.printStackTrace();
              } catch (IOException e) {
                e.printStackTrace();
              }
              try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                  sb.append(line + "n");
                }
                is.close();
                json = sb.toString();
              } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
              }
              // try parse the string to a JSON object
              try {
                jObj = new JSONObject(json);
              } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
              }
              // return JSON String
              return jObj;
            }
          }
          

          【讨论】:

          • 已弃用的解决方案!
          【解决方案7】:

          是的,你是对的,Asynctask 用于短期运行的任务,例如连接到网络。它还用于后台任务,这样您就不会因为您无法在 UI/主线程中进行网络连接而阻塞您的 UI 线程或获取异常。

          示例:

          class JSONAsyncTask extends AsyncTask<String, Void, Boolean> {
          
          
          @Override
          protected void onPreExecute() {
              super.onPreExecute();
          
          }
          
          @Override
          protected Boolean doInBackground(String... urls) {
              try {
          
                  //------------------>>
                  HttpGet httppost = new HttpGet("YOU URLS TO JSON");
                  HttpClient httpclient = new DefaultHttpClient();
                  HttpResponse response = httpclient.execute(httppost);
          
                  // StatusLine stat = response.getStatusLine();
                  int status = response.getStatusLine().getStatusCode();
          
                  if (status == 200) {
                      HttpEntity entity = response.getEntity();
                      String data = EntityUtils.toString(entity);
          
          
                      JSONObject jsono = new JSONObject(data);
          
                      return true;
                  }
          
          
              } catch (IOException e) {
                  e.printStackTrace();
              } catch (JSONException e) {
          
                  e.printStackTrace();
              }
              return false;
          }
          
          protected void onPostExecute(Boolean result) {
          
          }
          

          【讨论】:

          • "org.apache.http.legacy" 已弃用,还有其他方法可以实现吗?
          猜你喜欢
          • 2012-10-31
          • 2019-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-05
          相关资源
          最近更新 更多