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

Могут ли Honeycomb Loaders решать проблемы с обновлением AsyncTask + UI?

Выполнение чего-то в фоновом режиме, а затем обновление пользовательского интерфейса очень сложно реализовать на Android. Это просто плохо спроектировано. Типичным примером является AsyncTask, который извлекает что-то из Интернета и отображает результат. Есть две проблемы с этим:

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

  • Это может привести к OutOfMemoryException. Представьте, что у вас есть активность с большим количеством растровых изображений и запускается несколько AsyncTask. Вы нажимаете BACK (действие завершено), но AsyncTask все еще запущен и, поскольку он ссылается на Activity, активность с растровыми изображениями все еще находится в памяти. Повторите это (запустите Activity и BACK), и рано или поздно у вас будет сила.

Это можно решить, но это слишком сложно. В одном действии у меня есть 3 разных AsyncTasks, каждый из которых может работать в нескольких экземплярах одновременно. Реализация этого правильно разочаровывает. Код становится очень трудным для понимания и отладки.

Может Honeycomb Loaders как-то решить эту проблему? И есть ли способ использовать их в версиях до сотовых Android?

4b9b3361

Ответ 1

Да, из моего опыта работы с Loader они, похоже, решают общие проблемы, с которыми люди сталкиваются с AsyncTasks и изменениями конфигурации.

Я думаю, Google сказал, что статическая библиотека фрагментов будет включать Loaders, так что да, они также должны работать в обратном направлении, когда библиотека будет выпущена.

Ответ 2

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

http://evancharlton.com/thoughts/rotating-async-tasks/

Там есть и другие отличные посты.

Обновление:. Как отмечено в комментариях к OP, это работает только для изменения конфигурации (ориентации), но не работает при использовании кнопки BACK и перезапускается через меню "Главное меню" или "Список задач".

Если вам нужна одна AsyncTask за раз, вы можете использовать статическую ссылку на AsyncTask внутри Activity. Другой вариант - сохранить ссылку на приложение.

Затем, когда запускается новое действие, вы смотрите, работает ли запущенная программа AsyncTask и задается ли она как текущая активность (через установщик в AsyncTask). Обязательно синхронизируйте доступ к Activity внутри AsyncTask.