禁用ContentProvider URI上的通知

fra*_*llo 8 android android-contentprovider android-sqlite

我正在寻找一种方法来暂停给定ContentProvider的通知Uri.用例是:

  1. 一个Activity被绑定到一个CursorAdapter通过CursorLoader.
  2. A Service可以在a上进行大量批量,单行更新ContentProvider.
  3. CursorLoader将加载其上的每一行更新内容,作为ContentProvider被通知侦听ContentResolver#notifyChange.

由于我无法编辑ContentProvider,并且我无法控制批处理查询执行,是否有办法暂停Uri(在执行中Service)通知,直到所有ContentProvider管理的查询都已执行?我需要这个,以避免连续重新获得的闪烁CursorLoader.

Wol*_*yer 3

您无法在您的服务中禁用此机制。但您应该尝试使用ContentProviderOperations对它们进行批处理。

我已经写了一篇关于 ContentProviderOperations 的介绍性文章和另外两篇文章,分别介绍了方法withYieldAllowed()withBackReference()

尤其是后一个应该对您在此处描述的内容感兴趣。

使用 ContentProviderOperations,您可以批量进行多个更新和插入。如果您随后调用applyBatch()ContentResolver 对象,则 ContentProvider 会立即执行所有这些内容。

现在我从未使用过 Nicolas Klein 的生成器,但由于他是一位非常非常熟练的 Android 开发人员并且在 Google 工作,我敢打赌生成的代码会使用事务,并且notifyChange()在最后只调用一次完整的批次。

正是您所需要的。

  • 事实上,CalendarContract 和 ContactsContract 所做的事情有点复杂。它们存储批处理是否正在执行。如果是这样,则不会在每个插入/更新/删除方法中进行通知。[例如,参见 CalendarContract 的方法。](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.2.2_r1/com/android/providers/calendar /SQLiteContentProvider.java#SQLiteContentProvider.insert%28android.net.Uri%2Candroid.content.ContentValues%29) 但是你是对的,**每个 ContentProvider 操作都会调用 apply**。我偏离了轨道。对不起! (2认同)