Это очень хороший вопрос, программисту Android требуется время, чтобы полностью разобраться в проблеме. Действительно, у AsyncTask есть две основные проблемы, которые связаны:
- Они слабо привязаны к жизненному циклу деятельности.
- Они очень легко создают утечки памяти.
В приложении RoboSpice Motivations (доступно в Google Play) мы подробно отвечаем на этот вопрос. Он даст подробное представление об AsyncTasks, Loaders, их функциях и недостатках, а также познакомит вас с альтернативным решением для сетевых запросов: RoboSpice. Сетевые запросы являются обычным требованием в Android и по своей природе являются длительными операциями. Вот отрывок из приложения:
Жизненный цикл AsyncTask и Activity
AsyncTasks не следуют жизненному циклу экземпляров Activity. Если вы запускаете AsyncTask внутри Activity и вращаете устройство, Activity будет уничтожено и будет создан новый экземпляр. Но AsyncTask не умрет. Он будет жить, пока не завершится.
И когда он завершится, AsyncTask не обновит пользовательский интерфейс нового Activity. На самом деле он обновляет предыдущий экземпляр активности, который больше не отображается. Это может привести к исключению типа java.lang.IllegalArgumentException: представление, не прикрепленное к диспетчеру окон, если вы используете, например, findViewById для получения представления внутри Activity.
Проблема с утечкой памяти
Очень удобно создавать AsyncTasks как внутренние классы ваших Activity. Поскольку AsyncTask необходимо будет управлять представлениями Activity, когда задача завершена или выполняется, использование внутреннего класса Activity кажется удобным: внутренние классы могут напрямую обращаться к любому полю внешнего класса.
Тем не менее, это означает, что внутренний класс будет содержать невидимую ссылку на свой экземпляр внешнего класса: Activity.
В конечном итоге это приводит к утечке памяти: если AsyncTask длится долго, он сохраняет активность «живой», тогда как Android хотел бы избавиться от нее, поскольку она больше не может отображаться. Действие не может быть собрано мусором, и это центральный механизм для Android для сохранения ресурсов на устройстве.
Это действительно очень плохая идея использовать AsyncTasks для длительных операций. Тем не менее, они подходят для короткоживущих, таких как обновление View через 1 или 2 секунды.
Я рекомендую вам загрузить приложение RoboSpice Motivations, он действительно подробно объясняет это и предоставляет образцы и демонстрации различных способов выполнения некоторых фоновых операций.
person
Snicolas
schedule
26.10.2012
doInBackground
замораживает экран, если индикатор выполнения не используется. - person venkatKA   schedule 09.10.2012