2013-05-12 3 views
14

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

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

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

+0

Можете ли вы поделиться учебником, на который вы ссылались? –

+0

Здесь вы найдете: http://neilgoodman.net/2011/12/26/modern-techniques-for-implementing-rest-clients-on-android-4-0-and-below-part-1/ –

ответ

11

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

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

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

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

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

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

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

2

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

Смежные вопросы