Android 为什么在内容提供者查询方法中通知侦听器?

Android 为什么在内容提供者查询方法中通知侦听器?,android,android-contentprovider,Android,Android Contentprovider,Vogella有关于内容提供商的介绍,下面(底部)的代码段有以下几行: cursor.setNotificationUri(getContext().getContentResolver(),uri) 我很好奇为什么有人想通知侦听器查询操作 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //

Vogella有关于内容提供商的介绍,下面(底部)的代码段有以下几行:

cursor.setNotificationUri(getContext().getContentResolver(),uri)

我很好奇为什么有人想通知侦听器查询操作

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

    // Using SQLiteQueryBuilder instead of query() method
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

    // Check if the caller has requested a column which does not exists
    checkColumns(projection);

    // Set the table
    queryBuilder.setTables(TodoTable.TABLE_TODO);

    int uriType = sURIMatcher.match(uri);
    switch (uriType) {
    case TODOS:
      break;
    case TODO_ID:
      // Adding the ID to the original query
      queryBuilder.appendWhere(TodoTable.COLUMN_ID + "=" + uri.getLastPathSegment());
      break;
    default:
      throw new IllegalArgumentException("Unknown URI: " + uri);
    }

    SQLiteDatabase db = database.getWritableDatabase();
    Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
    // Make sure that potential listeners are getting notified
    cursor.setNotificationUri(getContext().getContentResolver(), uri);

    return cursor;
}

它告诉游标要监视哪个uri,以便它知道其源数据何时更改。修改任何数据时,
ContentProvider
通知
ContentResolver
有关更改,然后
ContentResolver
通知所有注册的观察者。然后,如果您有任何已注册观察者的
游标加载程序
,可以通过此

加载新数据(如果我可以这么大胆的话),更直接的解释是:

我假设OP想知道为什么查询要通知侦听器。没有。它并没有立即通知监听器,只是设置为在与光标关联的数据发生更改时触发监听器。侦听器附加到当前上下文的ContentResolver;setNotificationUri只是告诉听众“注意这个URI”的一种简便方法


在类似于CursorLoader的情况下,加载器会自动在ContentResolver的上下文中注册ContentObserver,然后加载器在执行查询时调用setNotificationUri。如果光标中的数据发生更改,ContentObserver将关闭,这将告诉加载程序重置并执行新的查询。

我认为它会告诉观察者要监视哪些uri而不是光标。