Android – Правильный способ использования AsyncTasks?

Каков правильный способ использования asynctasks? Предположим, что пользователь вводит действие, и запускается асинтеза, и пока асинтеза работает, пользователь решает перейти на другую страницу.

  • Что произойдет с anynctask? Это будет работать, пока это не будет сделано?
  • Могу ли я как-то остановить эту асинтез?

Асинхронность будет продолжать работать. Asynctask может умереть, поскольку ОС Android пытается вернуть память, когда она работает на низком уровне. Если вам все равно, что асинхронная задача может не закончиться, возможно, это не имеет значения, но это плохая практика.

Кроме того, возможно, когда задача async умирает в зависимости от того, как вы храните / обрабатываете результат, вы рискуете попытаться отредактировать Activity / objects в этой активности, которые больше не существуют, что приводит к ошибкам nullpointer и другим плохим вещам. Правильным способом сделать это будет запуск службы из вашей активности и запуск асинтезы из службы. Вы должны следовать одному из шаблонов проектирования, изложенным в этом разговоре, указанном в Google IO 2010:

Шаблоны проектирования клиента REST для Android

Этот разговор интересен, но ему сложно следовать и не дает никакого кода, поэтому вот хороший учебник, который я использовал для изучения этого материала:

Загрузка данных с помощью служб

Кроме того, андроид будет управлять threadpool ваших задач asynch для вас (я считаю, что он начнет убивать их, когда у вас будет больше 5 в вашем процессе), вам не нужно их убивать. Ответьте здесь:

Как умирают AsyncTasks

Хорошо больно стараться быть быстрее:

  • Вы должны нести ответственность за остановку асинтезы, если не влияете отрицательно на вашу программу. Прочтите это .

  • Ваша asynctask передаст свою жизнь, делая onPreExecute () – doInBackground (Params …) – onPostExecute (Результат) -End asynctask life

  • Asynctask было выполнено для выполнения только один раз, тогда, если вы хотите выполнить его в другой раз, вы должны создать еще один
  1. Да, AsyncTask будет продолжать работать, если вы не остановите его при навигации в другое действие. Он будет продолжать работать, даже если конфигурация устройства изменится (например, он вращается). Если вы хотите что-то сделать в postExecute (), что влияет на пользовательский интерфейс, то вы должны убедиться, что ссылки на виджеты пользовательского интерфейса, которые вы изменяете в этом методе, действительны даже после ротации, когда воссоздана активность.

  2. Да, вы несете ответственность за остановку (это означает, что .cancel ()) вам AsyncTask, если она вам не нужна. Обратите внимание, однако, что AsyncTask, находящийся в середине его выполнения, не остановится только потому, что вы вызвали на него .cancel (). Он будет продолжать работать, но его метод postExecute () не будет вызываться, когда задача будет завершена.

Intereting Posts
Программирование сокетов для Android без WIFi-соединения Лучший способ кэшировать ответ XML / JSON в мое приложение. Полный текстовый файл? Воспроизведение звука с использованием примера soundpool AssetManager в LibGDX Программно читать состояние отладки в манифесте Android: Как получить идентификатор SIM-карты обеих SIM-карт в двух SIM-картах Требуется объяснение синтаксиса макета android Как создать настраиваемый шаблон для Intellij для использования с опцией Guava Почему мои взгляды не рисуются? Реализации вида Emoji (Emoticon) View / Keyboard Layouts Странная ошибка InputDispatcher «Потребительский закрытый входной канал или произошла ошибка. события = 0x8” Как использовать различную активность запуска в аромате продукта? Android: Как импортировать контакт с телефона? Библиотека штрих-кода Google Vision не найдена Как динамически устанавливать список заголовков в Retrofit 2 (Android)