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
中没有关于已执行操作的信息,因为它可能是需要通知的常规操作,也可能是不需要通知的“批处理”操作。是的,但我正在寻找一种方法,在不修改生成的代码/生成器的情况下获得相同的结果。