Потратив долгое время, пытаясь обернуть голову вокруг двух SO ответов ( здесь и здесь ), я думаю, что ContentObserver
s работает между этими 4 типами объекты - CursorLoader
с, Cursor
с, ContentResolver
с и ContentProvider
с:
CursorLoader
пробеги ContentResolver#query()
ContentResolver
запускает ContentProvider#query()
ContentProvider
запускает Cursor#setNotificationUri()
, передает его context.contentResolver
, а также Uri
параметр запроса Cursor
регистрирует свои собственные ContentObserver
1 Cursor
запускает #registerContentObserver()
на полученном ContentResolver
, передавая полученное Uri
и собственное ContentObserver
1 ContentProvider
возвращает Cursor
в CursorLoader
, через ContentResolver
CursorLoader
запускает #registerContentObserver()
в полученном Cursor
, передавая его собственное ContentObserver
2
ContentResolver
пробеги ContentProvider#insert()
ContentProvider
получает context.contentResolver
ContentProvider
пробеги ContentResolver#notifyChange()
, прохождение если параметр Uri
вставки с null
ContentObserver
ContentResolver
использует ContentObserver
1 для уведомления Cursor
об изменении Cursor
устанавливает свои mContentChanged
свойство true
Cursor
использует ContentObserver
2 для уведомления CursorLoader
об изменении CursorLoader
автоматически повторный запрос
Правильно ли это понимание?
Кроме того, весь ли setNotificationUri
и notifyChange
симбиоз только , так что CursorLoader
знает, когда изменение произошло? То есть, если бы я не использовал CursorLoader
и вместо этого просто использовал context.contentResolver
в качестве клиента для запроса ContentProvider
и получил Cursor
, было бы хорошо не использовать эти два метода уведомления?