AsyncTaskLoader против AsyncTask

129

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

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

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

ОКА
источник

Ответы:

51

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

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

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

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

Николай Еленков
источник
5
Я посмотрю на это. Возможно, еще слишком рано находить хорошие примеры AsyncTaskLoader, и когда больше разработчиков начнут использовать его, появятся новые примеры.
OKA
47

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

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

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

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

Хоанг Дык Донг
источник
11

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

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

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

Документ AsyncTaskLoader

Attif
источник
8

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

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

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

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

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

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

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

Палак Дарджи
источник