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();