Я разрабатываю приложение для Android, ориентированное на уровень API 8 (2.2, Froyo). Я использую ContentProvider, и это достаточно просто, и я использую SimpleCursorAdapter для заполнения списка, но я заметил в документации для SimpleCursorAdapter, что конструктор без флагов устарел со следующим примечанием:
This constructor is deprecated.
This option is discouraged, as it results in Cursor queries being performed on the application's UI thread and thus can cause poor responsiveness or even Application Not Responding errors. As an alternative, use LoaderManager with a CursorLoader.
Поскольку я ориентируюсь на уровень API 8, LoaderManager не привязан к Activity. Это делает класс FragmentActivity в пакете совместимости, но я не использую фрагменты.
Мой вопрос: как именно я должен использовать LoaderManager/CursorLoader в приложении, ориентированном на уровень API до 11? Должен ли я перейти к фрагментам или мне просто вернуться к устаревшему конструктору SimpleCursorAdapter (но использовать AsyncTask, чтобы он оставался дружественным к потоку пользовательского интерфейса, что и должен делать CursorLoader)?
Ответ 1 · рейтинг 23 · Alex Lockwood
Редактировать
Я довольно много писал о LoaderManager в этом записи блогаа>. Проверьте это и дайте мне знать, если это полезно! :)
Исходный пост
Определенно, определенно, определенно идите с LoaderManager. Класс CursorLoader разгружает работу по загрузке данных в поток и сохраняет данные постоянными во время краткосрочных событий обновления активности, таких как изменение ориентации. В дополнение к выполнению исходного запроса CursorLoader регистрирует ContentObserver с запрошенным вами набором данных и вызывает forceLoad() при изменении набора данных и, таким образом, автоматически обновляется. Это чрезвычайно удобно, так как вам не нужно беспокоиться о выполнении запросов самостоятельно. Конечно, можно использовать AsyncTask, чтобы сделать ваше приложение дружественным к потокам пользовательского интерфейса, но это потребует гораздо больше кода... и реализация вашего класса, чтобы он, например, сохранял загруженные Cursor поверх Activity, не будет быть простым. Суть в том, что LoaderManager/Loader сделает это автоматически за вас, а также позаботится о правильном создании и закрытии Cursor на основе жизненного цикла Activity.
Чтобы использовать LoaderManager/CursorLoader в приложении, ориентированном на уровень API до 11, просто используйте класс FragmentActivity в пакете совместимости. FragmentActivity - это просто Activity, созданный для поддержки совместимости с Android и не требующий использования Fragment в вашем приложении. Просто используйте getSupportLoaderManager() вместо getLoaderManager() и все будет готово. Конечно, вы можете реализовать родительский элемент FragmentActivity для каждого экрана и отображать его макет в виде Fragment (используя FragmentActivity.getSupportFragmentManager() в методе Activity onCreate()). Этот дизайн может упростить переход к макетам с несколькими панелями, если вы когда-нибудь решите оптимизировать свое приложение для планшетов. Это тоже хороший опыт обучения :).
Это тоже неплохой учебник. . Попробуйте пройти через это и не стесняйтесь оставлять комментарии, если у вас есть другие вопросы.