Android 禁用ContentProviderURI上的通知

Android 禁用ContentProviderURI上的通知,android,android-contentprovider,android-sqlite,Android,Android Contentprovider,Android Sqlite,我正在寻找一种方法来挂起给定ContentProvider的Uri上的通知。用例是: 活动通过游标加载程序绑定到游标适配器 服务可能会在内容提供者上执行大量批量、单行更新 CursorLoader将在每次行更新时重新加载其内容,因为ContentProvider会通过以下方式通知侦听器 由于我无法编辑ContentProvider,并且我无法控制批处理查询的执行,因此是否有方法在执行ContentProvider管理的所有查询之前挂起Uri(在执行服务中)上的通知?我需要它,以避免连续重新查询游

我正在寻找一种方法来挂起给定
ContentProvider
Uri
上的通知。用例是:

  • 活动
    通过
    游标加载程序
    绑定到
    游标适配器
  • 服务
    可能会在
    内容提供者
    上执行大量批量、单行更新
  • CursorLoader
    将在每次行更新时重新加载其内容,因为
    ContentProvider
    会通过以下方式通知侦听器

  • 由于我无法编辑
    ContentProvider
    ,并且我无法控制批处理查询的执行,因此是否有方法在执行
    ContentProvider
    管理的所有查询之前挂起
    Uri
    (在执行
    服务中)上的通知?我需要它,以避免连续重新查询
    游标加载程序

    所导致的闪烁。您不能在服务中禁用此机制。但您应该尝试使用批处理

    我已经写了一篇文章和另外两篇文章,分别介绍了方法和

    特别是后一个应该是你在这里描述的感兴趣的

    使用ContentProviderOperations,您可以批处理多个更新和插入。如果随后调用ContentResolver对象,ContentProvider会立即执行所有这些对象。

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


    正是您所需要的。

    您能用自己的ContentResolver替代吗


    然后,您可以尝试使用自己的类扩展ContentResolver,您可以覆盖notifyChange方法并在其中实现您的逻辑。

    在内容提供程序类中的
    query()
    方法中,在返回光标之前,只需注释如下所示的代码即可

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

    要做到这一点:您对服务和CP都没有影响力?另一方面,如果服务由您控制,请提供更多关于您正在执行哪种CP更新的详细信息。我正在一个简单的
    for
    循环中执行一系列“更新或插入”类查询。我正在使用一个
    ContentProvider
    ,它在每次
    插入
    更新后都会发出通知,但在这种特殊情况下,我希望能够暂停所有通知,直到我完成所有实体的更新。更详细地说,我正在使用Nicolas Klein的生成器生成我的
    ContentProvider
    ()在
    更新(Uri Uri,ContentValues value,String selection,String[]selectionArgs)结束时,
    执行一个简单的
    getContext().getContentResolver().notifyChange(Uri,null)
    。我们讨论的代码是,我想Nicolas没有在其中添加任何通知,因为没有表级
    Uri
    需要通知,因为任何给定的
    操作都可能对任何
    Uri
    起作用。对吗?您可以使用通用Uri。这就是ContactsContract和CalendarContract所做的。他们分别使用或在applyBatch结束时通知您。我建议在生成的代码中添加类似的内容。如果我能够应用一批模拟插入或更新的操作,我可以轻松地通知
    ContentProvider
    之外的更改。您认为扩展
    ContentProviderOperatione> 构建自定义的
    插入更新操作是可行的吗?这将在不影响生成的代码的情况下解决它。更新:不幸的是,它不会解决任何问题,因为
    方法应用
    提供程序。插入
    提供程序。更新
    提供程序。删除
    ,将通知委派给
    >ContentProvider
    实现
    插入
    更新
    删除
    。事实上,CalendarContract和ContactsContract所做的事情有点复杂。它们存储批处理是否正在执行。如果是这样,则不会在每个插入-/update-/delete方法中通知。但是您是对的,将调用apply对于每个ContentProvideroperation。我都偏离了轨道。抱歉!问题是我在
    notifyChange
    中没有关于已执行操作的信息,因为它可能是需要通知的常规操作,也可能是不需要通知的“批处理”操作。是的,但我正在寻找一种方法,在不修改生成的代码/生成器的情况下获得相同的结果。