studio implement hilos definicion curso create asynctask android android-asynctask networkonmainthread

implement - hilos asynctask android



AsyncTask para devolver un booleano? La mejor manera de implementar? (3)

Compruebe la conexión en el método doInBackground() de AsyncTask<Url, Void, Boolean> Params = url, progress = void (nothing) y result es un booleano.

onPostExecute() volverá al hilo principal de su aplicación

Estoy intentando verificar la conexión a Internet en Android (una conexión real, a diferencia del acceso a la red) que causa la NetworkOnMainThreadException . Debido a esto, estoy tratando de moverlo a una AsyncTask .

Este es mi método isConnected() :

if(!checkNetwork(parent)){ return false; } if(!checkConnection(url)){ return false; } return true;

Ahora, if(isConnected()) la conexión simplemente usando if(isConnected()) pero recibo la excepción. Entonces, lo que tengo que hacer es mover el método anterior a AsyncTask y recuperar el valor que devuelve.

Pensé que quizás podría hacer una variable global que lo mantuviera al tanto, pero no estoy seguro de si mi valor sería devuelto antes o después de que AsyncTask lo haya configurado.

Estoy seguro de que hay formas de hacerlo, así que estoy buscando ideas sobre cómo hacerlo. ¡Cualquier consejo es apreciado!

EDITAR: He actualizado mi código para usar AsyncTask, avíseme si se ve mejor:

ConnectUtils.java:

public class ConnectUtils { private static boolean hasConnected, hasChecked; public boolean isConnected(Context parent, String url){ hasChecked = false; this.new CheckURL(parent, url).execute(); while(!hasChecked){ } return hasConnected; } private class CheckURL extends AsyncTask<Void, Void, Boolean>{ private Context parent; private String url; public CheckURL(Context parent, String url){ this.parent = parent; this.url = url; } @Override protected Boolean doInBackground(Void... params){ if(!checkNetwork(parent)){ return false; } if(!checkConnection(url)){ return false; } return true; } @Override protected void onPostExecute(Boolean result){ super.onPostExecute(result); hasConnected = result; hasChecked = true; } } private static boolean checkNetwork(Context parent){ ConnectivityManager conMgr = (ConnectivityManager)parent.getSystemService(Context.CONNECTIVITY_SERVICE); if(conMgr.getActiveNetworkInfo() != null){ NetworkInfo activeInfo = conMgr.getActiveNetworkInfo(); if(!activeInfo.isConnected() || !activeInfo.isAvailable()){ return false; } return true; } return false; } private static boolean checkConnection(String url){ boolean responded = false; HttpGet requestTest = new HttpGet(url); HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 3000); HttpConnectionParams.setSoTimeout(params, 5000); DefaultHttpClient client = new DefaultHttpClient(params); try { client.execute(requestTest); responded = true; } catch (Exception e){ e.printStackTrace(); } return responded; } }

llamado a través de if(!new ConnectUtils().isConnected(this, "http://google.com"))


En el método onPostExecute , llame a una función en su actividad para procesar el estado (ahora conocido) de la conexión. Hasta que ese método se ejecute, su UI y / o lógica interna deberían reflejar que el estado de la conexión es desconocido.


aquí hay un código de muestra:

new AsyncTask<Void, Void, Boolean>() { @Override protected Boolean doInBackground(Void... p) { return isConnected(); } @Override protected void onPostExecute(Boolean result) { //this is code for the UI thread, now that it knows what is the result. } }.execute();