Какова практическая цель cursorLoader?

Я видел несколько статей о CursorLoader как это, но я до сих пор не понимаю конкретной цели его использования.

Я разработал приложения с использованием SQL и восстановления курсора. Дело в том, что это было очень быстро. Я запросил и проанализировал курсор с>500 записями и 8 столбцами за несколько миллисекунд. Так что не заметил каких-либо задержек на старых телефонах. Так зачем мне его использовать?

3 ответа

Решение

CursorLoader используется якобы для запроса ContentProvider с LoaderManager.LoaderCallbacks<Cursor>,

Есть две вещи, которые вы должны иметь в виду, чтобы понять CursorLoader:

  • Он загружает данные в отдельный поток.

  • Он контролирует базовый источник данных на наличие обновлений, выполняя запросы при обнаружении изменений.

Сейчас подходит к LoaderManager, Проще говоря, LoaderManager отвечает за управление одним или несколькими Loader связан с Activity или же Fragment, каждый Activity и каждый Fragment имеет ровно один LoaderManager экземпляр, который отвечает за запуск, остановку, сохранение, перезапуск и уничтожение его Loader s. Эти события иногда инициируются непосредственно клиентом, вызывая initLoader(), restartLoader(), или же destroyLoader(), Однако, так же часто, эти события вызваны Activity / Fragment события жизненного цикла. Например, когда Activity разрушен, Activity поручает его LoaderManager уничтожить и закрыть его Loader s (а также любые ресурсы, связанные с ними, такие как Cursor).

LoaderManager не знает, как загружаются данные, и не нуждается в этом. Скорее, LoaderManager поручает его Loader s, когда запускать / останавливать / сбрасывать их нагрузку, сохраняя их состояние при изменениях конфигурации и предоставляя простой интерфейс для доставки результатов обратно клиенту.

Итак, вы видите, все это не так просто, когда вы используете простой AsyncTask и запросить базу данных SQLite. Вот почему структура обеспечивает CursorLoader а также LoaderManager:

  • Для выполнения запросов в отдельном потоке.
  • Для мониторинга источника данных на предмет изменений и обновления пользовательского интерфейса.
  • Легко интегрироваться с жизненным циклом Activity а также Fragment,

Практическая цель - просто, как Android обрабатывает элементы пользовательского интерфейса (то есть в основном потоке). По сути, все, что может быть длительным процессом, запускайте его в фоновом потоке, чтобы не блокировать основной поток. Этого нельзя сказать достаточно. После Gingerbread это стало более обязательным для самого Android. Проверьте помощник SQL. Чтобы перейти к вопросу об открытии соединения SQLite и его "скорости":

Поскольку они могут быть продолжительными, убедитесь, что вы вызываете getWritableDatabase() или getReadableDatabase() в фоновом потоке, например, с помощью AsyncTask или IntentService.

Используя CursorLoader, это делает вашу жизнь проще, если вам нужно ContentResolver и используют базу данных SQLite. Что еще более важно, он работает на заднем плане. То, что вы никогда не видели блокировку БД, не означает, что этого не произойдет. Лучше быть в безопасности, чем потом сожалеть, и главная тема поблагодарит вас:)

Использовать CursorLoader из библиотеки поддержки для запуска асинхронных запросов в фоновом режиме. Таким образом вы гарантируете, что загрузка данных не вызывает сообщений "Приложение не отвечает".

CursorLoader запускает асинхронный запрос в фоновом режиме к ContentProvider, а затем возвращает результат обратно в Activity или Fragment, откуда он был вызван. Основное преимущество заключается в том, что он помогает пользователю взаимодействовать с Activity или Fragment, пока запрос все еще выполняется в фоновом режиме.

Другие вопросы по тегам