2012-03-23 14 views
5

Quiero usar una AsyncTask para verificar una InetAddress, como en el siguiente código. La variable tempInet es una variable global que indica si el sitio web era contactable o no.Cómo cancelar una Android AsyncTask después de un cierto período de tiempo? (Por ejemplo, 10 segundos)

Comienzo la AsyncTask con el código ... new InetAsyncTask(). Execute ("www.facebook.com");

Mi problema es que quiero que la AsyncTask se cancele después de (digamos) 10 segundos.

Algunas otras preguntas sugieren usar el método get (10, TimeUnit.SECONDS). Me gustaría hacer esto pero no estoy seguro de dónde/cómo poner el método get. Con ejecutar? En el método doInBackground?

Además, ¿el método get() bloquea el hilo principal? Si lo hace, ¿de qué sirve?

Cualquier ayuda apreciada.

class InetAsyncTask extends AsyncTask<String, String, Boolean> { 



    @Override 
    protected Boolean doInBackground(String... params) { 

     try {     
       InetAddress.getByName("www.facebook.com"); 
       return true;   

       } catch (UnknownHostException e) { 
        return false; 
       } 

    } //end doInBackground function 



    protected void onPostExecute(Boolean... result) { 

      tempInet = result[0]; 

    } 


    } //end class 

preguntas relacionadas

Android - Setting a Timeout for an AsyncTask?

stop async task after 60 second

Desarrolladores de Android AsyncTask Documentación

http://developer.android.com/reference/android/os/AsyncTask.html

Respuesta

1

Debe hacer un gestor que cancela el AsyncTask (http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))

Enviar un mensaje retrasado a este controlador como :

Handler.sendMessageDelayed(msg, delayMillis) 

private android.os.Handler mHandler = new android.os.Handler() { 

    @Override 
    public void handleMessage(Message msg) { 
     (Your AsyncTask object).cancel(true); 
    } 
} 
0

Para responder a su pregunta. La clave para usar con get() es la siguiente:

Boolean isHost = new AsyncTask<String, Void, Boolean>() { 
      @Override 
      protected Boolean doInBackground(String... params) { 
       try {     
        InetAddress.getByName(params[0]); 
        return true;   
       } catch (UnknownHostException e) { 
        return false; 
       } 
      } 
     }.execute("www.facebook.com").get(PING_TIME, TimeUnit.MILLISECONDS); 

Los bloques Get método del hilo que llama, siempre y cuando el resultado tiene que ser devuelto. Por lo tanto, solo debe usarlo en situaciones de prueba. Si desea obtener una respuesta asincrónica, comience de la siguiente manera (este es uno de mis ejemplos, deberá cambiarlo para su propósito):

private AsyncTask<Void, Void, Boolean> mAsyncTask; 

private android.os.Handler timeHandler = new android.os.Handler() { 
@Override 
public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     // react here or... 
     mAsyncTask.cancel(true); 
    } 
}; 

public void pingServer() { 

    timeHandler.sendEmptyMessageDelayed(1, PING_TIME);   
    mAsyncTask = new AsyncTask<Void, Void, Boolean>() { 
      @Override 
      protected Boolean doInBackground(Void... params) { 
       // stop the time handler 
       timeHandler.removeMessages(1); 
       return restService.pingServer(); 
      } 

      @Override 
      protected void onPostExecute(Boolean isOnline) { 
       super.onPostExecute(isOnline); 
       // use result after execution (e.g.: send to callback) 
      } 


      @Override 
      protected void onCancelled(Boolean aBoolean) { 
       super.onCancelled(aBoolean); 
       // ...react here 
      } 
     }.execute(); 
} 
Cuestiones relacionadas