Intereting Posts
Изменение высоты ActionBar по темам Исключить конкретные варианты сборки Как предотвратить двойной запуск кода, дважды щелкнув по кнопке в Android Анимация не запускается в элементах ListView, которые в настоящее время видны Как я могу вызвать экран настроек Wi-Fi из своего приложения с помощью Android Dex loader не может выполнить dex: идентификатор метода не в : 65536 Получить текст с веб-страницы в строку Студия Android – эмулятор укладывается за пределы экрана Как обрабатывать несколько таймеров обратного отсчета в ListView? Как загрузить URL-образ в износе android? Показ неопределенного прогресса в Школе Action Bar Как получить ресурсы по имени (строка), а не по целому числу Android Deep linking: используйте ту же ссылку для приложения и магазина воспроизведения Как я могу получить размер холста пользовательского представления вне метода onDraw? Как вычислить шаг ноги с помощью шагомера

Как остановить поток asynctask в android?

Я хочу остановить поток AsyncTask из другого потока AsyncTask . Я попробовал как new AsyncTask.cancel(true) чтобы остановить фоновый процесс, но он не остановился.

Может ли кто-нибудь помочь мне в этом?

Solutions Collecting From Web of "Как остановить поток asynctask в android?"

Объявите свой asyncTask в своей деятельности:

 private YourAsyncTask mTask; 

Создайте его так:

 mTask = new YourAsyncTask().execute(); 

Убить / отменить его вот так:

 mTask.cancel(true); 

Причина, по которой вещи не останавливаются для вас, заключается в том, что процесс (doInBackground ()) выполняется до тех пор, пока он не будет завершен. Поэтому вы должны проверить, отменен ли поток или нет, прежде чем делать вещи:

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

Итак, в основном, если поток не отменен, сделайте это, иначе пропустите его 🙂 Может быть полезно проверить это несколько раз во время вашей операции, особенно перед тем, как приступить к работе.

Также было бы полезно «очистить» в

 onCancelled(); 

Документация для AsyncTask:

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

Надеюсь это поможет!

Вы также можете использовать его в onPause или onDestroy жизненного цикла Activity :

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

Где loginTask – объект вашей AsyncTask

Спасибо.

Вы не можете сразу убить асинтеску. Чтобы остановить это, вы должны сначала отменить его:

 task.cancel(true); 

И в методе doInBackground () asynctask проверьте, отменено ли оно:

 isCancelled() 

И если это так, прекратите выполнение его вручную.

У меня была аналогичная проблема – по сути, я получал NPE в async-задаче после того, как пользователь уничтожил фрагмент. После изучения проблемы с переполнением стека я принял следующее решение:

 volatile boolean running; public void onActivityCreated (Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); running=true; ... } public void onDestroy() { super.onDestroy(); running=false; ... } 

Затем я периодически проверяю «if running» в моем асинхронном коде. Я испытал это, и теперь я не могу «сломать» свою деятельность. Это прекрасно работает и имеет то преимущество, что оно проще, чем некоторые из решений, которые я видел на SO.

U может проверить onCancelled () один раз:

Защищенный объект doInBackground (Object … x) {

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

}