2011-10-19 21 views
44

Voglio interrompere un thread AsyncTask da un altro thread AsyncTask. Ho provato come new AsyncTask.cancel(true) per interrompere il processo in background ma non si è fermato.Come interrompere il thread asynctask in Android?

Qualcuno potrebbe aiutarmi in questo?

risposta

87

dichiarare il vostro AsyncTask nella vostra attività:

private YourAsyncTask mTask; 

un'istanza in questo modo:

mTask = new YourAsyncTask().execute(); 

uccisioni/annullare in questo modo:

mTask.cancel(true); 
+2

dopo aver usato in questo modo YourAsynchTask mTask = new YourAsncTask(); mTask.execute(); lavorato. simpatico. – Senthil

+3

È un po 'fastidioso, però, che non si può davvero annullare se si ottiene una singola operazione (come una query di database), ad esempio. Se la query richiede molto tempo ed è solo una chiamata, sembra che non ci sia modo di cancellarla:/ – AgentKnopf

+0

Se stai facendo qualcosa all'interno di AsyncTask (in un loop), allora potresti voler controllare isCancelled() - refer https://stackoverflow.com/questions/10882543/how-to-completly-kill-remove-delete-stop-an-asynctask-in-android – amar

21

Il motivo per cui le cose non si fermano è perché il processo (doInBackground()) viene eseguito fino al termine. Pertanto si dovrebbe verificare se il filo viene cancellato o non prima di fare cose:

if(!isCancelled()){ 
// Do your stuff 
} 

Quindi, fondamentalmente, se il thread non viene annullato, farlo, altrimenti saltare :) potrebbe essere utile per verificare la presenza di questo alcune volte durante la tua operazione, soprattutto prima che il tempo prenda delle cose.

Inoltre potrebbe essere utile per "ripulire" un tantino in

onCancelled(); 

Documentazione per AsyncTask:

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

Spero che questo aiuti!

+0

se si passa true come parametro, quindi si fermerà sull'attività in background, quindi questo sarebbe utile solo se si passa false in 'task.cancel (boolean)' –

1

Ho avuto un problema simile - essenzialmente stavo ottenendo un NPE in un task asincrono dopo che l'utente aveva distrutto il frammento. Dopo aver studiato il problema su Stack Overflow, ho adottato la seguente soluzione:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

Poi, verifico "se in esecuzione" periodicamente nel mio codice asincrono. Ho provato questo stress e ora non sono in grado di "interrompere" la mia attività. Questo funziona perfettamente e ha il vantaggio di essere più semplice di alcune delle soluzioni che ho visto su SO.

6

Non si può semplicemente uccidere asynctask immediatamente. Al fine di fermarsi si deve prima annullare:

task.cancel(true); 

e che in doInBackground di AsyncTask() metodo di controllo se è già annullato:

isCancelled() 

e se lo è, smettere di eseguirlo manualmente .

-4

u può controllare onCancelled() una volta, quindi:

oggetto protetto doInBackground (Object ...x) {

while (/* condition */) { 
    if (isCancelled()) break; 
} 
return null; 

}

+0

Non si tratta di annullare AsyncTask da un altro thread. – QMaster

9

Si può anche avere ad usarlo in o onDestroy di Activity del ciclo di vita:

//you may call the cancel() method but if it is not handled in doInBackground() method 
if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED) 
    loginTask.cancel(true); 

dove loginTask è oggetto della tua AsyncTask

Grazie tu.

+0

Sono venuto qui esattamente per questo! – winklerrr

Problemi correlati