Урок 89. AsyncTask. Cancel – отменяем задачу в процессе выполнения

Обсуждение уроков
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 89. AsyncTask. Cancel – отменяем задачу в процессе

Сообщение Mikhail_dev » 21 авг 2014, 13:35

А если паузу делать с внешней стороны асинкТаска, а не непосредственно внутри него? Я так понимаю человек говорит о спонтанной паузе, а не о константе какой-то. Хотя в принципе можно сделать проверку всяких isInterrupted и прочее, но не всегда это будет возможно, особенно когда мы тянем данные с блокирующих методов, в этой ситуации нас так не остановить.
Если останавливать в doInBackground, максимум, что может произойти, остановка очереди,
А может и не произойти, если асинкТаски установлены в параллельный запуск. Хотя по умолчанию последовательный.

NAVI
Сообщения: 1
Зарегистрирован: 27 дек 2015, 08:23

Re: Урок 89. AsyncTask. Cancel – отменяем задачу в процессе

Сообщение NAVI » 27 дек 2015, 08:33

Ребята, всем привет!

У меня есть три кнопки: Start, Cancel, Result
Если нажать их последовательно (запуск AsyncTask, его отмена и попытка получения результата), то получаю ошибку:
---
W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xb2e85288)
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method for android:onClick
...
Caused by: java.lang.reflect.InvocationTargetException
...
Caused by: java.util.concurrent.CancellationException
---
т.е. при попытке получения результата методом get(), следует проверить isCancelled()
Тогда приложение не будет вылетать

shirakz
Сообщения: 9
Зарегистрирован: 23 сен 2015, 20:33

Re: Урок 89. AsyncTask. Cancel – отменяем задачу в процессе

Сообщение shirakz » 17 фев 2016, 08:18

NAVI писал(а):java.lang.IllegalStateException: Could not execute method for android:onClick
метод скорее всего неправильно написан, я так понимаю в xml-файле он onclick, а в коде onClick

Lobanov
Сообщения: 1
Зарегистрирован: 25 авг 2016, 23:40

Re: Урок 89. AsyncTask. Cancel – отменяем задачу в процессе

Сообщение Lobanov » 25 авг 2016, 23:46

Доброго времени суток.
Я написал класс AsyncTask, в нем есть Анимация Alpha.
Когда я запускаю Activity, анимация начинает проигрываться, далее я нажимаю кнопку выход из приложения на телефоне. Потом заново запускаю приложение и анимация уже не играет.
В onCreate я запускаю AsyncTask вот так:

Код: Выделить всё

Delay delay = new Delay();
delay.execute();

Код: Выделить всё

class Delay extends AsyncTask<Void, Integer, Void>{

        @Override
        protected Void doInBackground(Void... params) {
                while (line <=2){
                   publishProgress(line++);
                   Thread.sleep(15000);
                   return null;
                }

        @Override
        protected void onProgressUpdate (Integer... values){

            final TextView textView1 = (TextView)findViewById(R.id.textView1);
            final TextView textView2 = (TextView)findViewById(R.id.textView2);
            final Animation a = AnimationUtils.loadAnimation(this, R.anim.alpha);

            switch(line){
                case 1: textView1.startAnimation(a);break;
                case 2: textView2.startAnimation(a);break;
                default: break;
                }
}
Я засек время анимации, пусть это будет 30 секунд. Запускаю приложение проходит 5 секунд я выхожу из приложения. Захожу обратно, анимация уже не работает. Я жду оставшиеся 25 секунд, и она начинает работать с самого начала. Получается, что пока старая анимация в фоновом режиме не доиграет, новая не начинается. Получается при выходе из приложения мне не нужно убивать Activity, мне нужно убить AsyncTask. И приостановка AsyncTask в моем случае не поможет, т.к. если приостановить AsyncTask, то Activity при выходе все равно потеряется. А при возврате в приложение запустив приостановленный AsyncTask, он будет ссылаться на убитую Activity. Мне поможет только полная остановка AsyncTask при нажатии на кнопку "Назад" на телефоне.
Затем я воспользовался уроком 89 и решил остановить задачу. Я добавил действия для кнопки "Назад":

Код: Выделить всё

@Override
public void onBackPressed() {
        Delay delay = new Delay();
        delay.cancel(true);
        finish();
}
Затем в doInBackground добавил метод if (isCancelled()) return null;

Код: Выделить всё

@Override
        protected Void doInBackground(Void... params) {

                while (line <=22){
                publishProgress(line++);
                try{
                    Thread.sleep(5000);
                    if (isCancelled()) return null;
                }catch(Exception e){}
                }
            return null;
        }
Получается когда мы нажимаем кнопку "Назад", срабатывает метка delay.cancel(true); А потом в потоке doInBackground проверяется, если isCancelled равен true, то мы завершаем задачу. Но, не работает все равно. Что я делаю не так? Анимация не проигрывается второй раз, пока не пройдет 30 секунд, несмотря на то что я завершил задачу doInBackground.

Ответить