Android:AsyncTask来做一个HTTP GET请求?

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

是的你是正确的,Asynctask是用于短期运行的任务,如连接到networking。 也用于后台任务,所以你不会阻止你的UI线程或获取exception,因为你不能做你的UI /主线程的networking连接。

例:

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) { } 

从谷歌 这一个检查出来LINK和emaple 太好了

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

是的,你有3个select

  1. 使用AsyncTask
  2. 你可以使用Handler
  3. 或者你可以使用一个seperate Thread

最好的select是AsyncTask。 你必须在AsyncTask doInBackground方法中实现你的network call ,并在postExecute方法中更新main ui Thread或任何你想做的结果。

你可以按照你的要求遵循本教程

代码片段

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

这里是简单的HttpsURLConnectionASyncTask类中的Https POST / GET web-API调用与包头和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 (Header-parameter)的值是[API-key]:[API-Secret]Base64编码值[API-key]:[API-Secret]在start中追加"Basic "string。

在Android Studio中,使用Gradle条目:

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

AsyncTask确实pipe理它的线程池,但是它并没有针对networking活动进行优化。 实际上,如果你对同一个服务器有很多的HTTP请求,那么在内存消耗和整体性能上都要保持在同一个线程上,并且尽可能地重用一个持久连接。 AsyncTask不考虑这样的问题。

而不是伪造自己的asynchronousHTTP客户端,可以考虑使用less数可用的库之一。 一些聪明人投入了相当多的思想,使这些强大,灵活和快速。