Android: AsyncTask to make an HTTP GET Request?

前端 未结 7 690
失恋的感觉
失恋的感觉 2020-11-27 19:46

I\'m new to Android development. My question is, do I use AsyncTask in order to make an HTTP GET request (JSON response)? Is this correct? Does anyone know where I can see a

相关标签:
7条回答
  • 2020-11-27 20:09
    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
    }
    
    0 讨论(0)
  • 2020-11-27 20:10

    Yes you are right, Asynctask is used for short running task such as connection to the network. Also it is used for background task so that you wont block you UI thread or getting exception because you cant do network connection in your UI/Main thread.

    example:

    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) {
    
    }
    
    0 讨论(0)
  • 2020-11-27 20:11

    Yes you have 3 choices

    1. Using AsyncTask
    2. You can use Handler
    3. or you can use a seperate Thread.

    Best choice is AsyncTask. You have to implement your network call in doInBackground method of AsyncTaskand in postExecute method update the UI or whatever you want to do with the result.

    you can follow follow this tutorial for your requirement

    code snippet

    @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;
        }
    

    N.B: As DefaultHttpClient is deprecated you can use HttpClientBuilder

    0 讨论(0)
  • 2020-11-27 20:24

    Here is simple HttpsURLConnection in ASyncTask class for Https POST/GET web-API calling along with packet-header and JSONObject in body.

    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;
        }
    
    }
    

    Here the value of Authentication (Header-parameter) is the Base64 encoded value of [API-key]:[API-Secret] appending the "Basic " string in start.

    In Android Studio, use the Gradle entry as:

    compile 'org.apache.httpcomponents:httpcore:4.4.1'
    compile 'org.apache.httpcomponents:httpclient:4.5'
    
    0 讨论(0)
  • 2020-11-27 20:27

    Check this out LINK and emaple from 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;
      }
    }
    
    0 讨论(0)
  • 2020-11-27 20:29

    AsyncTask does manage its thread pool, but it is not optimized for network activity. Actually, if you have many HTTP requests to the same server, it is better both in terms of memory consumption and overall performance to keep them on the same thread, and reuse a persistent connection, whenever possible. AsyncTask does not consider such issues.

    Instead of forging your own asynchronous HTTP client, consider using one of the few available libraries. Some smart people invested quite a lot of thought into making these robust, flexible and fast.

    0 讨论(0)
提交回复
热议问题