Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как перейти с управляемого запроса на LoaderManager/CursorLoader?

Автор вопроса: mkuechОтветов: 1

Я разрабатываю приложение для 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)?

  • Ознакомьтесь с этим сообщением в блоге: Понимание LoaderManager (часть 2) Adrian Monk 02.08.2012
  • Здравствуйте, где задокументировано, что LoaderManager привязан к фрагментам? Это просто для получения данных из БД. Уровень модели всегда отделен от уровня пользовательского интерфейса в любой сложной программной парадигме. IgorGanapolsky 02.01.2014
  • @IgorGanapolsky В документации для LoaderManager: Interface associated with an Activity or Fragment for managing one or more Loader instances associated with it. This helps an application manage longer-running operations in conjunction with the Activity or Fragment lifecycle ... и единственные типы Activity, связанные со старыми платформами, - это FragmentActivity. mkuech 20.02.2014
  • Правильно, пользователь сказал: я вынужден перейти на фрагменты. Ответ - нет. Обычная активность отлично подойдет для этих целей. IgorGanapolsky 21.02.2014
  • @IgorGanapolsky Верно, но только в API постфрагментов. Вам не нужно переходить на Fragments, но вы, по крайней мере, должны перейти на Activity, который поддерживает Fragments (что тривиально). Не возражаю, просто поясняю, если кто-то все еще поддерживает GB или более раннюю версию. mkuech 28.03.2014

androidjavaandroid-fragmentssimplecursoradapterandroid-loadermanager

Ответы

Ответ 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()). Этот дизайн может упростить переход к макетам с несколькими панелями, если вы когда-нибудь решите оптимизировать свое приложение для планшетов. Это тоже хороший опыт обучения :).

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы