2011-10-19 12 views

Odpowiedz

87

zadeklarować swój asyncTask w swojej działalności:

private YourAsyncTask mTask; 

oznacz ją tak:

mTask = new YourAsyncTask().execute(); 

zabitych/anulować to tak:

mTask.cancel(true); 
+2

po użyciu w ten sposób YourAsynchTask mTask = new YourAsncTask(); mTask.execute(); pracował. miły. – Senthil

+3

To trochę irytujące, że nie możesz naprawdę anulować, jeśli masz na przykład pojedynczą operację (taką jak zapytanie do bazy danych). Jeśli zapytanie zajmuje dużo czasu i jest tylko jednym połączeniem, wydaje się, że nie ma możliwości jego anulowania:/ – AgentKnopf

+0

Jeśli robisz coś wewnątrz AsyncTask (w pętli), możesz chcieć sprawdzić isCancelled() - refer https://stackoverflow.com/questions/10882543/how-to-completly-kill-remove-delete-stop-an-asynctask-in-android – amar

21

Powodem, dla którego rzeczy się nie zatrzymują, jest to, że proces (doInBackground()) działa, dopóki nie zostanie zakończony. Dlatego należy sprawdzić, czy gwint jest odwołany lub nie wcześniej robi rzeczy:

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

Więc w zasadzie, jeśli wątek nie został odwołany, to zrobić, w przeciwnym razie pominąć :) może być przydatne, aby sprawdzić to kilka razy podczas twojej operacji, szczególnie przed upływem czasu.

także może być przydatny do "oczyścić" alittle w

onCancelled(); 

dokumentacja dla AsyncTask:

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

Nadzieja to pomaga!

+0

jeśli przełączysz true jako parametr, to zatrzyma się on w tle, więc byłoby to pomocne tylko wtedy, gdybyś przekazał wartość false do 'task.cancel (boolean)' –

1

Miałem podobny problem - w zasadzie otrzymywałem NPE w zadaniu asynchronicznym po zniszczeniu fragmentu przez użytkownika. Po zbadaniu problemu na przepełnienie stosu, ja przyjęła następujące rozwiązanie:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


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

    running=false; 
    ... 
} 

Następnie sprawdzam „jeśli działa” okresowo w moim kodu asynchronicznego. Testowałem to stresowo i teraz nie jestem w stanie "zepsuć" mojej aktywności. Działa to doskonale i ma tę zaletę, że jest prostsze niż niektóre rozwiązania, które widziałem na SO.

6

Nie można po prostu zabić asynctask natychmiast. Aby go zatrzymać, należy najpierw anulować go:

task.cancel(true); 

i niż w asynctask za doInBackground() Sprawdź metody, jeśli jest już anulowane:

isCancelled() 

a jeżeli tak, to zatrzymać wykonywanie go ręcznie .

-4

u można sprawdzić onCancelled() po czym:

chronionego obiektu doInBackground (Object ...x) {

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

}

+0

Nie chodzi o anulowanie AsyncTask z innego wątku. – QMaster

9

Można również użyć go w lub onDestroy z Activity cyklu życia:

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

gdzie loginTask jest przedmiotem swojej AsyncTask

podziękowaniem ty.

+0

Przyszedłem tutaj właśnie za to! – winklerrr

Powiązane problemy