Какова практическая цель 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, пока запрос все еще выполняется в фоновом режиме.