AsyncTaskLoader vs AsyncTask - PullRequest
       29

AsyncTaskLoader vs AsyncTask

126 голосов
/ 19 августа 2011

С Honeycomb и v4 Compatibility Library можно использовать AsyncTaskLoader.Насколько я понимаю, AsyncTaskLoader может выжить через изменения конфигурации, такие как переворот экрана.

Рекомендуется ли использовать AsyncTaskLoader вместо AsyncTask?LoaderManager тоже входит в картинку?

Но я не нашел ни одного хорошего примера (ов) о том, как правильно использовать AsyncTaskLoader.Документы также не содержат примеров.Кто-нибудь может привести несколько хороших примеров.

Ответы [ 4 ]

51 голосов
/ 19 августа 2011

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

  • ведет список LoaderManager
  • , чтобы они не были уничтожены при перевороте телефона (или при другом изменении конфигурациипроисходит), сохраняя экземпляры с помощью onRetainNonConfigurationInstance()
  • пинка правильного загрузчика при вызове initLoader() в вашей активности

Для взаимодействия с загрузчиками необходимо использовать LoaderManagerи предоставьте необходимые обратные вызовы для создания ваших загрузчиков и заполнения ваших представлений возвращаемыми данными.

Как правило, это проще, чем управлять AsyncTask собой.Тем не менее, AsyncTaskLoader не совсем хорошо задокументировано, поэтому вы должны изучить пример в документации и / или смоделировать свой код после CursorLoader.

42 голосов
/ 13 января 2017

При сравнении AsyncTaskLoader против AsyncTask , как вы, возможно, знаете, когда вы поворачиваете экран вашего устройства, он может уничтожить и воссоздать вашу деятельность, чтобы сделать ее понятной, позволяя изображению вращатьсяВаше устройство во время сетевой транзакции:

AsyncTask будет снова выполнено как фоновый поток, а предыдущая обработка фонового потока была просто избыточной и зомби.

AsyncTaskLoader будет просто повторно использоваться на основе идентификатора загрузчика, который ранее был зарегистрирован в Loader Manager, поэтому избегайте повторного выполнения сетевой транзакции.

В итоге, AsyncTaskLoader предотвратит дублированиефоновых потоков и устраните дублирование действий зомби.

10 голосов
/ 27 сентября 2016

AsyncTaskLoader выполняет ту же функцию, что и AsyncTask , но немного лучше.Он может легче обрабатывать изменения конфигурации действий и ведет себя в течение жизненных циклов фрагментов и действий.Приятно то, что AsyncTaskLoader можно использовать в любой ситуации, когда используется AsyncTask.В любое время, когда данные должны быть загружены в память для обработки действия / фрагмента, AsyncTaskLoader может выполнять эту работу лучше.

Однако есть несколько проблем с использованием AsyncTasks:

  • Изменения конфигурации могут испортить ситуацию
  • Приостановка действия не приостанавливает AsyncTask
  • Достаточное количество стандартного кода (что означает больше возможных ошибок)

AsyncTaskLoader doc

6 голосов
/ 18 февраля 2018

Некоторые различия, отличные от описанных в других ответах:

При использовании AsyncTaskLoader над AsyncTask :

  • AsyncTaskLoader дает нам возможность загружать старые кэшированные данные до тех пор, пока новые данные не будут возвращены forceLoad()

  • Мы можем установить задержки на AsyncTaskLoader на setUpdateThrottle()который может предотвратить последовательное обновление клиента (Activity / Fragment)

  • AsyncTaskLoader может быть разделено на несколько фрагментов, если они имеют общую родительскую активность и если она была запущена из getActivity().getSupportLoaderManager()

  • AsyncTaskLoader уничтожается LoaderManger, когда связанная с ним деятельность больше недоступна.в то время как нам нужно вручную уничтожить AsyncTasks , если его вызывающая активность разрушается.Это экономит наше время от написания всего проясняющего материала.AsyncTaskLoader хорошо играет с соответствующими жизненными циклами.

Итак, AsyncTaskLoader намного лучше, чем AsyncTask.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...