Как перейти от managedQuery к LoaderManager / CursorLoader? - PullRequest
15 голосов
/ 17 января 2012

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

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

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

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

1 Ответ

23 голосов
/ 17 января 2012

Редактировать:

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


Оригинальный пост:

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

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

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

...