Подтвердить что ты не робот

Что установить 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? Цель состоит в том, чтобы не создавать утечек памяти и быть эффективными.

4b9b3361

Ответ 1

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

Использование преимуществ класса 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().