Могут ли Honeycomb Loaders решить проблемы с обновлением AsyncTask + UI? - PullRequest
13 голосов
/ 24 февраля 2011

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 24 февраля 2011

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

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

4 голосов
/ 24 февраля 2011

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

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

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

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

...