@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 ? Из цикла он выходит однозначно.
AsyncTask может быть отменен в любое время при вызове cancel (boolean). После isCancelled (), будет возвращать true. Дальше вызовется onCancelled (Object), вместо onPostExecute (Object). Для гарантии отмены задачи как можно быстрее, вы должны проверять возвращаемое значение isCancelled () в doInBackground (Object []), например, внутри цикла как у вас в примере.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники