ContentObserver
とDatasetObserver
の違いは何ですか?
いつ使用する必要がありますか?
単一行でCursor
を取得します。データの変更について通知を受けたい-例:行が更新されたとき。
どのオブザーバークラスを登録する必要がありますか?
ContentProvider
(ContentResolver
またはActivity.managedQuery()
経由)を使用してデータを取得している場合は、ContentObserver
をCursor
に添付するだけです。 。 onChange()
のコードは、ContentResolver
がカーソルに関連付けられたUri
の通知をブロードキャストするたびに呼び出されます。
Cursor myCursor = managedQuery(myUri, projection, where, whereArgs, sortBy);
myCursor.registerContentObserver(new ContentObserver() {
@Override
public void onChange(boolean selfChange) {
// This cursor's Uri has been notified of a change
// Call cursor.requery() or run managedQuery() again
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
}
ContentProvider
が「善良な市民」であることを確認し、クエリの後にUri
をカーソルに登録します。
cursor.setNotificationUri(getContentResolver(), uri);
また、基になるデータへの変更をContentResolver
に通知する必要があります(たとえば、SQLiteデータベースでの挿入、削除、および更新操作中)。
getContentResolver().notifyChange(uri, null);
このアプローチは、オブジェクト指向設計のオブザーバーパターンの良い例です。
この質問がまだ誰かのレーダーにあるかどうかはわかりません。私はしばらくの間、同じ質問に苦しんでいます。 DataSet ObserverとContentObserverのどちらを使用するかを決定するためのリトマステストとして私が思いついたのは、非常に簡単です。
通知でURIを送信する必要がある場合は、ContentObserverを使用します。あるオブジェクトに別のオブジェクトが変更されたことを通知する必要があるだけの場合は、DataSetObserverを使用します。
少なくとも私にとっての区切り要因は、通知を送信しているオブジェクトが、その基になるリソース(オブジェクト、レコード、クエリ、カーソルなど)を「UniversalResourceIdentifiers」としてアプリケーションの残りの部分に公開することです。または、オブジェクトはそのデータのソースを非表示にしますか。
Ptcの回答を補足するために、DataSetObserver
は Adapter のコンテンツ変更を処理するために使用されます。たとえば、 Adapterを使用してリストビューを動的に更新する に使用できます。 =。 Adapter#registerDataSetObserver()
メソッドを使用してDataSetObserver
を登録できます。
DataSetObserver
を使用して、同様の方法で カーソル のコンテンツの変更を監視することもできます。
私が開発した最後のアプリから、私は言うことができます。 ContentObserverとDataSetObserverの主な違いは、ContentObserverがContentProviderに影響を与える変更をObserverに加えることです。一方、DataSetObserverObserverはデータベースへの変更の影響を監視します。