Страницы

Поиск по вопросам

суббота, 15 июня 2019 г.

AsyncTask vs IntentService vs что-то другое при работе с сетью

Есть некоторое приложение, которое по запросу пользователя загружает некоторые данные из сети и отображает их. Сетевые запросы в этом приложении выполняются в отдельном потоке средствами AsyncTask
Ввиду того, что многие категорически советуют не использовать AsyncTask при работе с интернетом (а выносить сетевые запросы в сервис) и возник данный вопрос.
Чуть подробнее:
Суть приложения - отображение списка (текстовых) новостей из нескольких источников.
Как это реализовано сейчас:
Есть активити с Navigation Drawer, в котором отображается список сайтов, по клику на определенный пункт меню появляется фрагмент, содержащий RecyclerView, куда с помощью AsyncTask загружаются данные с выбранного сайта.
При прокрутке RecyclerView до определенного элемента запускается AsyncTask который подгружает в RecyclerView следующую порцию информации и так далее (эдакий Endless RecyclerView).
При выборе другого пункта меню, появляется другой фрагмент, но с таким же принципом работы (просто данные грузятся из другого источника).
При создании каждого из фрагментов выполняется setRetainInstance(true), то есть при изменении конфигурации устройства данные из AsyncTask благополучно вернутся в нужный фрагмент.
Процесс извлечения нужной информации с сайтов организован с помощью Jsoup
Вопросы:
Чем плоха такая архитектура данного приложения? (в части использования AsyncTask и в общем).
Хорошим ли тоном для данной конкретной задачи является использование AsyncTask? Или же стоит перенести работу с сетью в сервис? (я понимаю, что не все типы сервисов работают не в главном потоке).
А если все же стоит перенести работу с сетью в сервис, то при необходимости загрузки данных запускать сервис, загружать данные, возвращать данные во фрагмент и завершать сервис? И так каждый раз?
Честно говоря, хоть и на каждом углу написано, что AsyncTask - это плохо, я не вижу явных причин для вынесения работы с сетью в сервис в данном конкретном приложении. Но раз многие говорят, значит я чего-то не понимаю. Объясните мне это, пожалуйста.
По сути, AsyncTask же предназначен для кратковременных задач, а у меня загружается очень небольшой объем данных (текст), и в итоге AsyncTask как раз отрабатывает за пару секунд.
А основное назначение сервиса - это, насколько я понял, выполнение длительных фоновых задач.
Еще раз повторюсь - я не утверждаю, что в данном случае лучшим решением будет использование AsyncTask, но и аргументов против его использования я не вижу.
А может есть какие-либо другие более правильные архитектурные решения для данной задачи?
Хоть интернет и читал (очень много читал), но буду рад как ссылкам, где описывается что-то подобное (может я пропустил), так и Вашим ответам по данной теме и Вашим мнениям по данному вопросу.


Ответ

Честно говоря, хоть и на каждом углу написано, что AsyncTask - это плохо
Так говорят только те, кто не умеет их готовить. AsyncTask вполне нормальная практика, если вы умеете справляться с пограничными кейсами: поворот экрана, уничтожени контекста и т.п.
AsyncTask не рекомендуют использовать по большей степени потому что есть уже готовые нормальные библиотеки типо Volley, Retrofit и т.п.
Сервисы используются для тяжёлых задач или же для периодических задач.

Комментариев нет:

Отправить комментарий