android - oncancelled - NetworkOnMainThreadException con AsyncTask
httpurlconnection android ejemplo (1)
Necesito hacer algunas solicitudes HTTP desde mi aplicación de Android. Uso AsyncTask según sea necesario, con la parte de red en doInBackground.
Aquí está mi clase de solicitud:
public class AsyncRequest extends AsyncTask<Void, Integer, HttpResponse>{
private ProgressDialog dialog;
private Activity activity;
private HttpUriRequest query;
private HttpClient client;
private HttpResponse response;
private String dialogMsg;
private String uri;
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public AsyncRequest(Activity a, HttpUriRequest q, HttpClient c, String m) {
query = q;
client = c;
activity = a;
dialog = new ProgressDialog(a);
dialogMsg = m;
}
@Override
protected void onPostExecute(HttpResponse res) {
if (dialog.isShowing())
dialog.dismiss();
}
protected void onPreExecute() {
this.dialog.setMessage(dialogMsg);
this.dialog.show();
}
@Override
protected HttpResponse doInBackground(Void... arg0) {
try {
response = client.execute(query);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
protected HttpResponse getResponse() {
return response;
}
}
Y, en mi hilo de interfaz de usuario, lo uso de esta manera:
AsyncRequest request;
HttpClient httpClient = new DefaultHttpClient();
HttpGet getQuery = new HttpGet("Here goes my url");
HttpResponse response = null;
String rt = "Null";
getQuery.setHeader("Authorization", getIntent().getExtras().getString("token"));
request = new AsyncRequest(this, getQuery, httpClient, "Loading events...");
try {
response = request.execute().get(3, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
HttpEntity entity = response.getEntity();
try {
rt = EntityUtils.toString(entity);
} catch (Exception e) {
e.printStackTrace();
return ;
}
Por lo tanto, soy un principiante de Android, pero creo que esta excepción se detecta cuando el código relacionado con la red se ejecuta en el hilo principal. Pero ejecuto client.execute () en mi método doInBackground (). ¿Es la llamada a ejecutar (). Get () (en el hilo ui) la causa del problema?
Tu tienes esto
response = request.execute().get(3, TimeUnit.SECONDS);
Llamar a get()
hace que AsyncTask
no sea más asincrónico. Bloquea el hilo ui esperando la respuesta. Esto lleva a la NetworkOnMainThreadException
.
Deshágase de get(3, TimeUnit.SECONDS);
Solo use request.execute()
. Puede actualizar ui en onPostExecute
. También puede usar la interfaz como devolución de llamada a la Actividad.
Verifique la respuesta por blackbelt en el siguiente enlace