ContentProviderClient VS ContentResolver

本文探讨了Android中ContentProviderClient与ContentResolver的区别及应用场景。ContentResolver适用于多个ContentProvider的交互,而ContentProviderClient在频繁访问同一ContentProvider时更为高效,但需注意及时释放资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一篇翻译自StackOverflow的文章。其主要论述的是ContentProviderClient与ContentResolver的区别。以及我们应该在什么情况下用ContentProviderClient代替ContentResolver。文章的地址是http://stackoverflow.com/questions/5084896/using-contentproviderclient-vs-contentresolver-to-access-content-provider

Robert Tupelo-Schneck的问题

在介绍如何使用ContentProvider的Android官方文档中,作者通过调用getContentResolver()方法获取ContentResolver对象。并且通过该对象来获得应用数据。

然而,除了上述方法外,还可以通过调用getContentResolver().acquireContentProviderClient(authority)方法获取ContentProviderClient对象,并通过该对象获得应用数据。根据我的观察相对与ContentResolver而言,ContentProviderClient从ContentProvider获取数据的方法更加简约。

我的问题是,我应该在什么情况下用ContentProviderClient代替ContentResolver?他们中哪一个更好?

jcwenger的答案

你的Android设备有很多的数据库,每一个都通过一个独一无二的内容标识区分。他是content://uri域名的一部分。

ContentResolver根据内容标识找到对应的ContentProvider,从而实现应用数据的存取。当你调用ContentResolver.query()ContentResolver.update()或别的其他的方法时,URI作为其参数的一部分被解析,内容标识别被识别。ContentResolver通过该内容标识找到对应的ContentProvider。每一次的寻找对应ContentProvider的操作都是非常耗费资源的操作,因为每次的URI都可能是不同的,对应的内容标识别也可能是不同的。另外,连接和断开连接对应的ContentProvider的操作也是非常耗费资源的。--我不确定连接是否可以回收利用,这需要阅读系统更深层次的代码。

相比较之下,当你调用acquireContentProviderClient(authority)时,寻找对应的ContentProvider的工作已经完成了。同时,你获得了一个ContentProviderClient对象。该对象本质上与对应的ContentProvider产生了一个连接。(他通过跨进程的通信和同步锁与对应的ContentProvider产生关联)。因此,当你使用ContentProviderClient时,你将会直接与对应的ContentProvider通信。这大大减少了寻找对应ContentProvider带来的消耗。

注意

根据acquireContentProviderClient()的文档提示:如果你获得了一个ContentProvider对象。该对象的必须在结束使用后,立刻调用ContentProviderClient.release()来释放。这会使得系统释放对应的ContentProvider对象,因为没有理由在让他继续存在了。因此如果保留ContentProviderClient对象的存在就意味着迫使对应的ContentProvider在后台继续运转。所以,记住,一定要记得释放ContentProviderClient对象。

总结

针对不同ContentProvider的多次调用:使用ContentResolver。

针对相同ContentProvider的多次调用:使用ContentProviderClient,但是记得释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值