Что установить 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
? Цель состоит в том, чтобы не создавать утечек памяти и быть эффективными.
Ответы
Ответ 1
Я писал об этой теме пару недель назад... возможно, чтение через это поможет. Вы можете также рассмотреть возможность чтения через пример кода на сайте разработчиков.
Какой конструктор я должен использовать?
Используйте 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()
.