Я новичок в разработке Android. Мой вопрос: я использую AsyncTask для того, чтобы сделать запрос HTTP GET (ответ JSON)? Это верно? Кто-нибудь знает, где я могу увидеть пример этого, если это действительно так? Если нет, не могли бы вы меня исправить? Спасибо!
Android: AsyncTask делает HTTP-запрос GET?
Ответ 1
Да, вы правы, Asynctask используется для выполнения коротких задач, таких как подключение к сети. Также он используется для фоновой задачи, так что вы не будете блокировать ваш поток пользовательского интерфейса или получить исключение, потому что вы не можете подключиться к сети в своем потоке пользовательского интерфейса/основного файла.
Пример:
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) {
}
Ответ 2
Отметьте LINK и emaple из google это тоже хорошо
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
Да, у вас есть 3 варианта
- Использование AsyncTask
- Вы можете использовать Обработчик
- или вы можете использовать
seperate Thread
.
Лучший выбор - AsyncTask. Вы должны реализовать метод network call
в doInBackground
AsyncTask
и в методе 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;
}
Ответ 4
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
}
Ответ 5
Вот простой класс HttpsURLConnection
в ASyncTask
для веб-API Https POST/GET, вызывающий вместе с заголовком пакета и 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", "[email protected]");
// 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) - это Base64
закодированное значение [API-key]:[API-Secret]
, добавляющее строку "Basic "
в начало.
В Android Studio используйте запись Gradle как:
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
Ответ 6
AsyncTask управляет пулом потоков, но не оптимизирован для сетевой активности. На самом деле, если у вас есть много HTTP-запросов к одному и тому же серверу, лучше как с точки зрения потребления памяти, так и общей производительности, чтобы поддерживать их в одном потоке и повторно использовать постоянное соединение, когда это возможно. AsyncTask не рассматривает такие проблемы.
Вместо того, чтобы подделать собственный асинхронный HTTP-клиент, рассмотрите возможность использования одной из немногих доступных библиотек. Некоторые умные люди вкладывали немало усилий в создание этих надежных, гибких и быстрых.