Intereting Posts
Программно свернуть или развернуть CollapsingToolbarLayout События TextWatcher запускаются несколько раз Play Store Бета-тестирование не работает Как включить как аппаратные, так и виртуальные клавиатуры на Android-сэндвич с мороженым Grep adb logcat и записать вывод в текстовый файл Использование тестовой платформы Android Android-студия – приложение с библиотечным проектом не может построить Android Spinner.setSelection () не работает Единичное тестирование сетевого ответа. Работает при отладке, а не при фактическом запуске Как программно спарить Bluetooth-устройство на Android Не найдено никаких совместимых целей Android-устройство не подключено к USB для отладки (Android-студия) Gradle Error – Не удалось вызвать IncrementalTask.taskAction () для задачи: project: mergeDebugResources ' Новый список приложений в стиле «Входящие» для Android с прорисовкой влево и вправо Содержимое вкладки остается видимым после изменения закладки после изменения ориентации

Что установить CursorAdapter (контекст контекста, курсор c, int flags), чтобы он работал с CursorLoader?

В документах google указывается, что нельзя использовать первый конструктор CursorAdapters ,

 CursorAdapter(Context context, Cursor c) 

Есть только два варианта,

 CursorAdapter(Context context, Cursor c, boolean autoRequery) 

В котором говорится

Конструктор, который позволяет контролировать автоматическое резервирование. Рекомендуется не использовать это, а вместо этого использовать CursorAdapter (Context, Cursor, int). При использовании этого конструктора всегда будет установлен FLAG_REGISTER_CONTENT_OBSERVER. `

а также

 CursorAdapter(Context context, Cursor c, int flags)` 

Который говорит, что это рекомендуемый конструктор.

Проблема в том, что здесь есть только два флага для использования здесь: FLAG_AUTO_REQUERY (int 1) и FLAG_REGISTER_CONTENT_OBSERVER (int 2). Использование FLAG_AUTO_REQUERY не имеет смысла, потому что теперь я использую CursorLoader, в котором можно управлять им в фоновом режиме, а также обновлять его. С FLAG_REGISTER_CONTENT_OBSERVER он говорит, что не нужен при использовании CursorLoader .

Теперь я спрашиваю, какое целое число я CursorAdapter(Context context, Cursor c, int flags) , чтобы заставить его работать с моим CursorAdapter ? Меня беспокоит, как правильно управлять старым курсором. Я не совсем уверен, как правильно это сделать.

Если я использую FLAG_REGISTER_CONTENT_OBSERVER , тогда я должен что-то делать с onContentChanged() , но при использовании swapCursor() в моем LoaderManager , поскольку курсор не закрыт, я мог бы просто сделать adapter.swapCursor(cursor).close() . Но будет ли конфликт с onContentChanged() в CursorAdapter ? Цель состоит в том, чтобы не вызывать утечек памяти и быть эффективными.

Solutions Collecting From Web of "Что установить CursorAdapter (контекст контекста, курсор c, int flags), чтобы он работал с CursorLoader?"

Я писал об этой теме пару недель назад … возможно, чтение через это поможет. Вы также можете рассмотреть возможность чтения кода примера на сайте разработчиков.

Использование преимуществ класса LoaderManager


Какой конструктор я должен использовать?

Используйте CursorAdapter(Context context, Cursor c, int flags) (в документации рекомендуется использовать этот конструктор над первым).

Какое целое число я CursorAdapter(Context context, Cursor c, int flags) .

Просто передайте ему целое число 0 . Вы не хотите передавать его FLAG_REGISTER_CONTENT_OBSERVER , так как вы используете CursorLoader с вашим CursorAdapter (поскольку CursorLoader регистрирует ContentObserver for you), and you definitely don't want to pass it FLAG_AUTO_REQUERY`, поскольку этот флаг устарел.

Меня беспокоит, как правильно управлять старым курсором. Я не совсем уверен, как правильно это сделать.

Весь смысл LoaderManager заключается в том, что он делает все неприятное управление курсором для вас, за кулисами. Удобство автоматического загрузки ваших данных, не беспокоясь об управлении запрошенным курсором, является тем, почему старые методы startManagingCursor и stopManagingCursor устарели.

… Я мог бы просто сделать adapter.swapCursor(cursor).close()

Не делай этого. LoaderManager закроет курсор самостоятельно. На самом деле, если я правильно помню, вы получите сообщение об ошибке, если попытаетесь вызвать close() на курсор. Похоже, вам не нужно переопределять onContentChanged() .