gpt4 book ai didi

android - 使用 ContentProviderClient 与 ContentResolver 访问内容提供者

转载 作者:IT老高 更新时间:2023-10-28 13:21:33 26 4
gpt4 key购买 nike

documentation on Android content providers描述了使用从 getContentResolver() 获得的 ContentResolver 来访问内容。

不过还有一个ContentProviderClient,可以从getContentResolver().acquireContentProviderClient(authority)中获取。它似乎提供了或多或少与 ContentResolver 中可用的方法相同的方法,用于从提供者访问内容。

我什么时候应该使用 ContentProviderClient 而不是直接使用 ContentResolver?有什么好处?

最佳答案

您的 android 设备有许多数据库,每个数据库都由唯一的 Content Authority 标识。这是 content://uri 中的“域名”等效部分——第一个斜杠之前的所有内容。

ContentResolver 存储提供从 String contentAuthorityContentProvider 的映射的数据。当你调用 ContentResolver.query()update() 或者你有什么时,URI 被解析成它的组件,contentAuthority 字符串被识别,contentResolver 必须在该映射中搜索匹配的字符串,并将查询定向到正确的提供者。这种昂贵的搜索发生在每次调用期间,因为每次调用的 URI 可能不同,并且 contentAuthority 也不同。此外,建立和断开与特定提供商的连接可能会产生一些成本——它不能在调用之间重复使用。我不确定那里涉及的开销,那是一些非常深的操作系统级代码。

相比之下,当您调用 acquireContentProviderClient(authority) 时,“我需要什么提供者?”查找完成一次,您将获得一个 ContentProviderClient,它本质上是到 ContentProvider 的直接链接。 (您和提供者之间存在一些涉及跨线程通信和并发锁定的粘合剂)。但是,当您使用 ContentProviderClient 时,您将直接与 Provider 对话以获得您请求的权限。这消除了不断重新计算“我想要哪个提供商?”的浪费。

注意: 根据 acquireContentProviderClient() documentation : 如果你获得了 ContentProviderClient,"调用者必须通过调用 ContentProviderClient.release() 来表明他们已经完成了提供者,这将允许系统释放提供者,它确定没有其他理由保持它处于 Activity 状态。 " 所以本质上,让陈旧的客户端保持打开状态将迫使提供者继续在后台作为服务运行。所以,记得清理!

总结:

多次调用不同的 contentAuthorities: 使用 ContentResolver

重复调用同一个权限:获取并使用ContentProviderClient。完成后记得释放()它。

关于android - 使用 ContentProviderClient 与 ContentResolver 访问内容提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5084896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com