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