AsynkTask. Как завершить преждевременно. Break?

276
23 января 2018, 11:48
@Override
protected Void doInBackground(String... params) {
    answer = "Вернулся " + params[0];
    do {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.gc();
        try {
            WeakCallback.get().getResult(answer);
        } catch (Exception e) {
            e.printStackTrace();
            Log.d(LOG_TAG,"активити пересоздан");
            break;
        }
    } while (x > 1);
    return null;
}

Экспериментирую. Запустил Активити, а через него перехожу на второе активити, в нем запускаю AsyncTask . Он крутится в бесконечном цикле. Ссылку на активити держит в WeakReference.Выхожу из активити, на первое активити. AsyncTask продолжает работу, пока я не начну грузить картинку и этим самым пробуждаю GC. Мое активити удаляется из памяти, я ловлю исключение и если его не обработать выходом из AsyncTask , то AsynckTask никогда не умрет (ну пока приоритет GC не доедет до него, а до этого момента будет жрать заряд и память). А вопрос собственно в том, правильно ли использовать оператор break . Return не могу применить, так как к убитой активити обратится. Завершит ли break работу AsyncTask ? Из цикла он выходит однозначно.

Answer 1

AsyncTask может быть отменен в любое время при вызове cancel (boolean). После isCancelled (), будет возвращать true. Дальше вызовется onCancelled (Object), вместо onPostExecute (Object). Для гарантии отмены задачи как можно быстрее, вы должны проверять возвращаемое значение isCancelled () в doInBackground (Object []), например, внутри цикла как у вас в примере.

READ ALSO
Стоит ли учить RxJava и Java 8 если я перешел на Kotlin?

Стоит ли учить RxJava и Java 8 если я перешел на Kotlin?

Вопрос такойЯ Android разработчик, пишу на котлине

270
Не сохраняется сущность в базу при использовании Spring/Hibernate

Не сохраняется сущность в базу при использовании Spring/Hibernate

Всем привет, не могу разобраться почему не сохраняется сущность DateException в базу данных при вызове метода контроллера addExceptionToEventКонтроллер...

283
Возможно ли привязать KeyListener к клавиатуре?

Возможно ли привязать KeyListener к клавиатуре?

Я хотел бы спросить можно ли привязать KeyListener к клавиатуре, то есть можно ли сделать так чтобы при запуске программы она не открывала окно,...

267