2012-03-23 4 views
5

Voglio usare un AsyncTask per controllare un indirizzoInet, come nel codice qui sotto. La variabile tempInet è una variabile globale che indica se il sito Web è contattabile o meno.Come cancellare un AsyncTask Android dopo un certo periodo di tempo? (Ad esempio 10 secondi)

Inizio il AsyncTask con il codice ... nuovo InetAsyncTask(). Execute ("www.facebook.com");

Il mio problema è che voglio che AsyncTask si annulli dopo (diciamo) 10 secondi.

Alcune altre domande suggeriscono di utilizzare il metodo get (10, TimeUnit.SECONDS). Mi piacerebbe farlo ma non sono sicuro di dove/come mettere il metodo get. Con esecuzione? Nel metodo doInBackground?

Inoltre, il metodo get() blocca il thread principale? Se lo fa, qual è il punto di esso?

Qualsiasi aiuto apprezzato.

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 

Domande correlate

Android - Setting a Timeout for an AsyncTask?

stop async task after 60 second

Sviluppatori Android AsyncTask Documentazione

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

risposta

1

Si dovrebbe fare un gestore che annulla l'AsyncTask (http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))

Invia un messaggio in ritardo a questo Handler come :

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

per rispondere alla tua domanda. Il codice da utilizzare con get() è la seguente:

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

Il GET metodo blocca il filo chiamante finché il risultato deve essere restituito. Dovresti quindi usarlo solo in situazioni di prova. Se vuoi ottenere una risposta asincrona, avviarla come segue (questo è uno dei miei esempi, dovrai modificarlo per il tuo scopo):

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