Чем плох AsyncTask?

Посмотреть в Telegram: @AndroidSobes/151
Все знают, что AsyncTask – это плохо и лучше его не использовать. На собеседовании могут спросить, почему это так.

1. Для того, чтобы использовать AsyncTask, нужно создать наследника этого класса. Использование через наследование требует написание бойлерплейт кода и не является гибким механизмом.

2. AsyncTask нарушает принцип единственной ответственности, т.к. выступает и классом, который выполняет бэкграунд задачу, и коллбэком, получающим результат.

3. Неудачный API. Часто работа с бэкграунд тредом в андроид-приложениях – это запрос в сеть или базу данных. Для обработки результата достаточно методов onSuccess() и onError(). AsyncTask предоставляет обычно ненужные коллбэки onPreExecute() и onProgressUpdate(), а также метод onPostExecute(), который вызывается в случаях и успешного выполнения, и ошибки. Это требует писать больше бойлерплейта.

4. На разных версиях андроида выполнение нескольких AsyncTask реализовано по-разному:

• До Api level 4 использовался единственный тред и все AsyncTask выполнялись по очереди.
• Начиная с Api level 4 и до 11 использовался тред пул и AsyncTask выполнялись параллельно.
• Начиная с Api level 11 снова начали использовать единственный тред.

Такие изменения вызывали путаницу и баги в приложениях.