Chcę zatrzymać wątek AsyncTask
z innego wątku AsyncTask
. Próbowałem jak new AsyncTask.cancel(true)
, aby zatrzymać proces w tle, ale nie zatrzymał się.Jak zatrzymać wątek asynktaskowy w systemie Android?
Czy ktoś może mi w tym pomóc?
Chcę zatrzymać wątek AsyncTask
z innego wątku AsyncTask
. Próbowałem jak new AsyncTask.cancel(true)
, aby zatrzymać proces w tle, ale nie zatrzymał się.Jak zatrzymać wątek asynktaskowy w systemie Android?
Czy ktoś może mi w tym pomóc?
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);
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!
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)' –
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.
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 .
u można sprawdzić onCancelled() po czym:
chronionego obiektu doInBackground (Object ...x) {
while (/* condition */) {
if (isCancelled()) break;
}
return null;
}
Nie chodzi o anulowanie AsyncTask z innego wątku. – QMaster
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.
Przyszedłem tutaj właśnie za to! – winklerrr
po użyciu w ten sposób YourAsynchTask mTask = new YourAsncTask(); mTask.execute(); pracował. miły. – Senthil
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
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