您的 android 设备有许多数据库,每个数据库都由唯一的 Content Authority 标识。这是 content:// uri 中的“域名”等效部分——第一个斜杠之前的所有内容。
ContentResolver
存储提供从String contentAuthority
到的映射的数据ContentProvider
。当您调用ContentResolver.query()
orupdate()
或您拥有什么时,URI 将被解析为其组件,识别 contentAuthority 字符串,并且 contentResolver 必须在该映射中搜索匹配的字符串,并将查询定向到正确的提供程序。这种昂贵的搜索发生在每次调用期间,因为每次调用的 URI 可能不同,并且 contentAuthority 也不同。此外,建立和断开与特定提供商的连接可能会产生一些成本——它不能在调用之间重复使用。我不确定那里涉及的开销,那是一些非常深的操作系统级代码。
相比之下,当您致电acquireContentProviderClient(authority)
时,“我需要什么提供者?” 查找只进行一次,您将获得一个ContentProviderClient
本质上是指向ContentProvider
. (您和提供者之间存在一些涉及跨线程通信和并发锁定的粘合剂)。但是,当您使用 时ContentProviderClient
,您将直接与提供者对话以获得您请求的权限。这消除了不断重新计算“我想要哪个提供商?”的浪费。
注意:根据acquireContentProviderClient() 文档:如果您获得 ContentProviderClient, “调用者必须通过调用ContentProviderClient.release()表明他们已与提供者一起完成,这将允许系统释放提供者它确定没有其他保持它活跃的原因。” 所以本质上,让陈旧的客户端保持打开状态将迫使提供者继续在后台作为服务运行。所以,记得清理!
概括:
多次调用不同的 contentAuthorities: 使用ContentResolver
.
重复调用相同的权限: 获取和使用ContentProviderClient
. 完成后记得释放()它。