[Из песочницы] Сравнение библиотек для выполнения асинхронных запросов
Если вам в проекте необходимо загружать картинки и/или отправлять http-запросы, выполнять любую другую долгую операцию, которая может заблокировать UI поток, то как ни крути придется использовать решение для выполнения асинхронных запросов.С самого начала я, по старинке, расскажу про стандартные способы AsyncTask/Loaders и объясню, почему их лучше не использовать. Затем расскажу про продвинутые методы решения этой задачи.
Самое тривиально решение AsyncTaskПлюсы:1. Простой для понимания.2. Решение из коробки.Минусы:1. Memory leak при перевороте экрана — старая activity не уничтожиться пока задача не выполниться, и результат придет в старую activity, и, скорее всего, вы словите exception.2. Нет обработки ошибок.3. Долгие операции будут прерваны как только система решит уничтожить ваше приложение (если вы его свернули например).
Пример кода:
requestDataTask = new AsyncTask
А теперь самое лучшее решение на мой взгляд — Robospice Плюсы:1. Robospice выполняет все операции в service. Это значит, что если activity уничтожится, то задача все равно будет продолжать выполняться. Лучшее решение для долгих задач.2. Есть методы для обработки ошибок.3. Кеширование запросов, интеграция с Retrofit.Но не все так радужно… Есть и минусы:1. Нет метода для проверки исполняется задача или нет, а это очень важная вещь для меня. На github есть пул реквест с решением этой проблемы — #383. Кому надо — используйте этот форк.2. Не самый удобный api в мире, но сойдёт.
Пример кода:
spiceManager.execute (new SpiceRequest
}
@Override public void onRequestSuccess (String s) {
} }); Достойное внимания решение — RxJava Хорошое решение с кучей разных фич, подробнее можно прочитать на Хабре в публикации «Реактивное программирование под Android».Вкратце от меня: есть обработка ошибок, поддержка жизненного цикла activity/fragment. Но не подходит для долгих операций (в отличие от Robospice), плюс лично мне было тяжело с ней разобраться, да и до сих пор кажется, что я не понимаю всего замысла.Мой собственный велосипед — Slige Task Плюсы:1. Простой для понимания т.к. основан на AsyncTask.2. Есть обработка ошибок.3. Поддержка жизненного цикла activity.4. Api немного поудобней.5. Легко проверить, исполняется задача или нет.Минусы:1. Скудный функционал в отличии от RxJava.2. Не подходит для долгих задач (см. Robospice).
Пример кода:
new SligeTask
Пишите в комментариях, какие вы используете библиотеки и почему.
Если кто-то заметил лямбды в примерах кода, но не знает, что это, как и зачем — обратите внимание на этот проект.