Выполнение чего-то в фоновом режиме, а затем обновление пользовательского интерфейса очень сложно реализовать на Android. Это просто плохо спроектировано. Типичным примером является AsyncTask, который извлекает что-то из Интернета и отображает результат. Есть две проблемы с этим:
-
В AsyncTask есть ссылка на Activity (потому что ему необходимо обновить свой интерфейс). После изменения ориентации экрана активность перезапускается. Но AsyncTask все еще ссылается на старое уничтоженное действие, поэтому он не может обновить интерфейс новой операции.
-
Это может привести к OutOfMemoryException. Представьте, что у вас есть активность с большим количеством растровых изображений и запускается несколько AsyncTask. Вы нажимаете BACK (действие завершено), но AsyncTask все еще запущен и, поскольку он ссылается на Activity, активность с растровыми изображениями все еще находится в памяти. Повторите это (запустите Activity и BACK), и рано или поздно у вас будет сила.
Это можно решить, но это слишком сложно. В одном действии у меня есть 3 разных AsyncTasks, каждый из которых может работать в нескольких экземплярах одновременно. Реализация этого правильно разочаровывает. Код становится очень трудным для понимания и отладки.
Может Honeycomb Loaders как-то решить эту проблему? И есть ли способ использовать их в версиях до сотовых Android?