Це дуже гарне питання, для програмування Android потрібен час, щоб повністю зрозуміти проблему. Справді, AsyncTask має дві основні проблеми, пов'язані між собою:
- Вони погано прив’язані до життєвого циклу діяльності
- Вони дуже легко створюють витоки пам'яті.
Всередині програми RoboSpice Motivations ( доступна в Google Play ) ми детально відповідаємо на це запитання. Це дасть глибокий огляд AsyncTasks, Loaders, їх особливостей та недоліків, а також познайомить вас з альтернативним рішенням для мережевих запитів: RoboSpice. Мережеві запити є загальною вимогою для Android і за своєю природою тривають операції. Ось уривок із програми:
Життєвий цикл AsyncTask та Activity
AsyncTasks не відповідають життєвому циклу екземплярів Activity. Якщо ви запустите AsyncTask всередині Activity і обернете пристрій, Activity буде знищено, і буде створено новий екземпляр. Але AsyncTask не помре. Він буде продовжувати жити, поки не завершиться.
І коли він завершиться, AsyncTask не буде оновлювати інтерфейс нової активності. Дійсно, він оновлює попередній екземпляр діяльності, який більше не відображається. Це може призвести до винятку типу java.lang.IllegalArgumentException: подання, не приєднане до диспетчера вікон, якщо ви використовуєте, наприклад, findViewById для отримання подання всередині Activity.
Проблема витоку пам'яті
Дуже зручно створювати AsyncTasks як внутрішні класи вашої діяльності. Оскільки AsyncTask потрібно буде маніпулювати поданнями Activity, коли завдання завершено або виконується, використання внутрішнього класу Activity здається зручним: внутрішні класи можуть отримувати безпосередній доступ до будь-якого поля зовнішнього класу.
Тим не менше, це означає, що внутрішній клас буде мати невидиме посилання на свій екземпляр зовнішнього класу: Activity.
У довгостроковій перспективі це спричиняє витік пам’яті: якщо AsyncTask триває довго, він зберігає активність «живою», тоді як Android хотів би позбутися від неї, оскільки вона більше не відображається. Діяльність не може бути зібрана сміттям, і це центральний механізм для Android для збереження ресурсів на пристрої.
Насправді дуже погана ідея використовувати AsyncTasks для тривалих операцій. Тим не менше, вони чудово підходять для короткоживучих, таких як оновлення подання через 1 або 2 секунди.
Я закликаю вас завантажити додаток RoboSpice Motivations , він справді пояснює це поглиблено, а також надає зразки та демонстрації різних способів виконання деяких фонових операцій.
doInBackground
функція заморожує екран, якщо не використовується індикатор виконання.