Должны ли загрузчики использоваться для доступа к веб-службам? - программирование
Подтвердить что ты не робот

Должны ли загрузчики использоваться для доступа к веб-службам?

Я понимаю, что платформа Loader предназначена для доступа к данным, хранящимся локально в базе данных ContentProvider/SQLite. У нас есть класс CursorLoader, который хорошо справляется с этим вариантом использования.

Но интересно ли использовать платформу Loader для написания классов, расширяющих Loader/AsyncTaskLoader для доступа к удаленным веб-сервисам (например, веб-службе REST)? Я всегда думал, что эта структура слишком жесткая и запутанная (отсутствие надлежащей документации) для этого варианта использования. Я предпочитаю обрабатывать вызовы REST более регулярно, используя AsyncTasks/Services. Но недавно я нашел несколько статей, в которых использовался AsyncTaskLoaders, и начал задаваться вопросом.

Итак, зачем кому-то использовать Loaders для доступа к веб-службам? Единственное преимущество, которое я вижу здесь, заключается в том, что Loaders автоматически сохраняют свои результаты. Здесь нет курсора для управления.

4b9b3361

Ответ 1

В реальности вы, вероятно, захотите использовать сетевую библиотеку, например Volley. Это имеет некоторые приятные функции, такие как пакетная обработка запросов и кэширование изображений. Тем не менее, ради аргумента можно сравнить Service, Loader и AsyncTask.

Службы - это путь, если вы хотите, чтобы загрузка продолжалась при изменении действий или фоновых приложений. Или, если вы хотите экспортировать свою услугу, чтобы использовать ее несколько приложений. В противном случае используйте Loader или AsyncTaskLoader.

Погрузчики имеют несколько преимуществ перед AsyncTasks.

  • Они с меньшей вероятностью могут вызывать сбои, выполняя код после завершения Activity, поскольку они знают о жизненном цикле android.
  • Проект не рекомендует ссылаться на View или Activities. Это уменьшает вероятность принуждения активности оставаться в памяти после того, как она уже завершена.
  • Отслеживать источник данных для изменений и запускать обратные вызовы при их возникновении.
  • У них встроено кэширование, которое может быть полезно после поворотов. Для Cursor s CursorLoader автоматически восстанавливается в правильном положении до последнего загруженного курсора.

Однако они также имеют недостатки

  • API чрезвычайно громоздкий, чем AsyncTask. Особенно, если вам нужна совместимость со старыми версиями Android.
  • Вы уже сохраняете состояние пользовательского интерфейса внутри onSaveInstanceState(), поэтому использование Loader заставляет вас сохранять состояние несколькими способами. Это может ввести в заблуждение чтение и понимание. Особенно, если вы закончите перемешивание оставшихся фрагментов в миксе.
  • Loader кэширует загруженный результат, а не состояние пользовательского интерфейса, которое вам действительно нужно

Я предполагаю, что вы просто читаете веб-сервисы, а не пишете. Если вы выполняете обновления веб-службы, и вам нужно увидеть ответ службы, это изменит ситуацию. Использование AsyncTask может помешать вам получить ответ, если он получен во время вращения.

Ответ 2

Есть случаи, когда Loader подходит для веб-сервисов: когда ваш сервер может отправлять push-уведомления обратно клиенту, чтобы уведомить, что данные изменены.