Я изучил, как использовать ContentProviders
и Loaders этот учебник
Как я вижу это:
Мы имеем Activity
с ListView
, SimpleCursorAdapter
и CursorLoader
. Мы также реализуем ContentProvider
.
В Activity
мы можем вызвать getContentResolver().insert(URI, contentValues);
нажатием кнопки.
В нашей реализации ContentProvider
в конце метода insert() мы вызываем getContentResolver().notifyChange(URI, null);
, а наш CursorLoader
получит сообщение о том, что он должен перезагрузить данные и обновить интерфейс. Также, если мы используем FLAG_REGISTER_CONTENT_OBSERVER
в SimpleCursorAdapter
, он также получит сообщение, и его метод onContentChanged()
будет вызван.
Поэтому наш ListView будет обновляться, если мы вставляем, обновляем или удаляем данные.
Activity.startManagingCursor(cursor);
устарел, cursor.requery()
устарел, поэтому я не вижу смысла в работе с cursor.setNotificationUri()
.
Я просмотрел исходный код метода setNotificationUri()
и увидел, что он вызывает mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver)
внутри метода. Также CursorLoader
делает то же самое. Наконец, курсор получит сообщение, и внутри курсора будет вызываться следующий метод:
protected void onChange(boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange, null);
// ...
}
}
Но я не могу понять это.
Итак, мой вопрос: почему мы должны называть cursor.setNotificationUri()
в query()
методе нашей реализации ContentProvider
?