Как перейти от managedQuery к LoaderManager/CursorLoader?

182
20

Я разрабатываю приложение для Android, которое нацелено на уровень API 8 (2.2, Froyo). Я использую ContentProvider и это достаточно просто, и я использую SimpleCursorAdapter, чтобы заполнить свой список, но я заметил в документации для SimpleCursorAdapter, что флагманский конструктор устарел со следующей заметкой:


Этот конструктор устарел.
Этот параметр не рекомендуется, так как это приводит к выполнению запросов курсора в потоке пользовательского интерфейса приложения и, следовательно, может привести к плохой отзывчивости или даже к ошибкам приложения, не отвечающим. В качестве альтернативы используйте LoaderManager с помощью CursorLoader.

Поскольку я нацелен на уровень API 8, LoaderManager не привязан к Activity. Класс FragmentActivity в пакете совместимости делает это, но я не использую фрагменты.


Мой вопрос: как именно я должен использовать LoaderManager/CursorLoader в приложении, ориентированном на уровень API до 11? Я вынужден перейти к фрагментам или мне нужно вернуться обратно к устаревшему конструктору SimpleCursorAdapter (но используйте AsyncTask, чтобы он поддерживал поток пользовательских интерфейсов, что и должен делать CursorLoader)?

спросил(а) 2021-01-19T14:17:27+03:00 9 месяцев, 1 неделя назад
1
Решение
222

Изменить:


Я написал довольно подробно о LoaderManager в этом сообщении в блоге. Проверьте это и дайте мне знать, если это будет полезно!:)


Оригинальное сообщение:

Определенно, определенно, с идеей LoaderManager. Класс CursorLoader разгружает работу по загрузке данных в потоке и сохраняет данные постоянными в течение коротких событий обновления активности, таких как изменение ориентации. Помимо выполнения начального запроса, CursorLoader регистрирует a ContentObserver с запрошенным вами набором данных и вызывает forceLoad() сам по себе, когда набор данных изменяется и, таким образом, автоматически обновляется. Это очень удобно, так как вам не нужно беспокоиться о выполнении запросов самостоятельно. Конечно, можно использовать AsyncTask, чтобы поддерживать дружественный интерфейс пользовательского интерфейса приложения, но он будет включать в себя гораздо больше кода... и реализацию вашего класса, чтобы он, например, сохранял загруженный Cursor Activity не будет простым. Суть в том, что LoaderManager/Loader сделает это автоматически для вас, а также заботится о правильном создании и закрытии Cursor на основе жизненного цикла Activity.


Чтобы использовать LoaderManager/CursorLoader в приложении, ориентированном на уровень API до 11, просто используйте класс FragmentActivity в пакете совместимости. A FragmentActivity является всего лишь Activity и был создан для поддержки совместимости Android и не требует использования Fragment в вашем приложении. Просто используйте getSupportLoaderManager() вместо getLoaderManager(), и вы должны быть настроены. Разумеется, вы могли бы реализовать родительский FragmentActivity для каждого экрана и отобразить его макет в Fragment (используя FragmentActivity.getSupportFragmentManager() в методе Activity onCreate()). Эта конструкция может облегчить переход к многоуровневым макетам, если вы когда-либо решили оптимизировать свое приложение для планшетов. Это хороший опыт обучения:).


Это довольно приятный учебник. Попробуйте и проработайте свой путь через него и не стесняйтесь оставлять комментарий, если у вас есть другие вопросы.

ответил(а) 2021-01-19T14:17:27+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема