2012-03-23 8 views
5

Chcę użyć AsyncTask, aby sprawdzić adres InetAdress, na przykład w kodzie poniżej. Zmienna tempInet jest globalną zmienną, która wskazuje, czy strona była możliwa do nawiązania, czy nie.Jak anulować AsyncTask Androida po określonym czasie? (Np. 10 sekund)

Zaczynam AsyncTask z kodem ... new InetAsyncTask(). Execute ("www.facebook.com");

Mój problem polega na tym, że chcę, aby AsyncTask anulował się po (powiedzmy) 10 sekundach.

Kilka innych pytań sugeruje użycie metody get (10, TimeUnit.SECONDS). Chciałbym to zrobić, ale nie wiem, gdzie/jak umieścić metodę get. Z execute? W metodzie doInBackground?

Co więcej, czy metoda get() blokuje główny wątek? Jeśli tak, jaki jest tego sens?

Każda pomoc doceniona.

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 

Podobne pytania

Android - Setting a Timeout for an AsyncTask?

stop async task after 60 second

Android Developers AsyncTask Dokumentacja

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

Odpowiedz

1

Należy dokonać obsługi, która anuluje Asynctask (http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))

Wyślij wiadomość do tej opóźnionej jak Handler :

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

Aby odpowiedzieć na pytanie. Kod w użyciu get() jest następujący:

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

Get metoda bloków wątku rozmówcy jak długo potrzebuje wynikiem zostać zwrócone. Dlatego powinieneś używać go tylko w sytuacjach testowych. Jeśli chcesz uzyskać odpowiedź asynchroniczną, uruchom ją w następujący sposób (jest to jeden z moich przykładów, musisz go zmienić w celu):

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(); 
} 
Powiązane problemy