2012-11-27 9 views
8

Desidero sapere qual è il modo migliore per arrestare un task async in esecuzione.Annulla/arresta attività asincrona Android

Ho provato

@Override protected void onCancelled() { 
     super.onCancelled(); 
     mTask.cancel(true);  
} 

Ho anche provato

asyncTaskObject.cancel(true); 

Questo funziona specialmente quando associato a un evento.

Ma supponiamo che lo scenario sia --- ci sono 4 AsyncTask. Prima chiama la seconda, la seconda chiama la terza e la terza chiama la quarta. Quando l'utente inserisce l'attività non c'è una finestra di dialogo. Altrimenti avremmo potuto usare il metodo onCancel lì. Quando l'utente fa clic in qualsiasi punto della pagina, la finestra di dialogo viene visualizzata se l'utente non fa clic in nessun punto, quindi non viene visualizzata alcuna finestra di dialogo, ma l'attività asincrona continua a funzionare in background. Supponiamo che l'utente faccia clic sul pulsante "indietro" o sull'icona di navigazione sul home page user.is tolto dall'attività corrente. Ma l'attività asincrona continua a funzionare in background e alla fine l'app si arresta in modo anomalo. Ho usato il metodo cancel in onBackPressed. Ma il problema è che non puoi essere sicuro di quale attività è in esecuzione e di nuovo i carsh delle app.

Qual è la via d'uscita?

risposta

12

mantenere riferimento all'oggetto AsyncTask come variabile di istanza e poi in OnDestroy() fare questo

@Override 
protected void onDestroy() { 
    if (mTask != null) { 
     mTask.cancel(true); 
    } 

    super.onDestroy(); 
} 
+0

'mTask' potrebbe essere' null' segui questo http://stackoverflow.com/a/34586053/1318946 –

0

Non sono del tutto sicuro di quando si desidera annullare le attività, ma qui ci sono alcuni suggerimenti: a) mantenere un riferimento a ogni attività in esecuzione. b) aggiungi un listener di chiusura alla tua finestra di dialogo e cancella tutte le attività lì (se è quello che vuoi fare). c) cancella tutte le attività al callback onStop della tua attività (se è quello che vuoi fare di nuovo).

3

In http://developer.android.com/reference/android/os/AsyncTask.html c'è una sessione denominata Regole di threading che dice che le istanze AsyncTasks devono essere create sul thread dell'interfaccia utente e che deve essere eseguita sul thread dell'interfaccia utente. Se invochi execute dal thread dell'interfaccia utente, puoi annullare il thread chiamando yourTaskInstance.cancel (true);