【翻译】ContentProviderClient VS ContentResolver

来源:互联网 发布:java waitfor 返回值1 编辑:程序博客网 时间:2024/05/21 17:03

这是一篇翻译自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,但是记得释放。

0 0