Подтвердить что ты не робот

Руководство для выбора между AsyncTaskLoader и AsyncTask для использования в фрагменте

Посмотрите LoaderCustomSupport (используйте AsyncTaskLoader) и FragmentRetainInstanceSupport (используйте Thread, почти эквивалентный к AsyncTask)

Оба примера имеют следующие общие черты.

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

Однако существуют различия.

AsyncTaskLoader

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

AsyncTask

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

Есть ли какая-либо директива или контрольный список, чтобы принять решение о том, следует ли выбирать AsyncTaskLoader или AsyncTask, выполнять трудоемкую задачу загрузки и обновлять результат до пользовательского интерфейса фрагмента?

4b9b3361

Ответ 1

ваш вопрос заинтересовал меня и иногда пытался изучить различия. Здесь я пишу свои наблюдения.

  • Для преждевременного завершения асинхронная задача с использованием AsyncTask будет продолжать работать в своем потоке. Обработка результатов может вскоре привести к необъявленным результатам, в то время как AsyncTaskLoader обрабатывает преждевременное завершение действия

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

  • AsyncTaskLoader предназначен для загрузки данных для DataAdapters, поэтому для этого лучше всего использовать AsyncTaskLoader. Но если вам нужно изменить UI (особенно фрагменты) после завершения задачи, лучше использовать AsyncTask, так как вы не можете изменять фрагменты in onLoadFinished от AsynTaskLoader.

Таким образом, использование зависит от вашей задачи. и если вышеуказанные 3 балла не беспокоят вас, тогда производительность одинакова (однако не найдены какие-либо документы, но в этом случае рекомендуется использовать asynctaskloader: S)

некоторые связанные ссылки

AsyncTaskLoader vs AsyncTask

http://andreas-kluck.blogspot.com/2012/02/asynctask-and-asynctaskloader.html

Ответ 2

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

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

Службы и сообщения Binder - это боль, хотя, на мой взгляд. Я нахожу гораздо более легкое решение - использовать LocalBroadcastManager для отправки передач прогресса от IntentService (или AsyncTaskLoader) и иметь BroadcastReceiver в Activity receive трансляцию и отображение прогресса.