Androidデバイスには多くのデータベースがあり、それぞれが一意のコンテンツ機関によって識別されます。これは、content://uriの「ドメイン名」に相当する部分です。最初のスラッシュの前のすべてです。
ContentResolver
String contentAuthority
からへのマッピングを提供するデータを格納しますContentProvider
。ContentResolver.query()
orまたはwhatを呼び出すとupdate()
、URIがそのコンポーネントに解析され、contentAuthority文字列が識別され、contentResolverはそのマップで一致する文字列を検索し、クエリを適切なプロバイダーに送信する必要があります。URIは呼び出しごとに異なり、contentAuthorityも異なる可能性があるため、このコストのかかる検索はすべての呼び出し中に発生します。さらに、その特定のプロバイダーへの接続のセットアップと切断に関連するコストが発生する可能性があります。これは、呼び出し間で再利用することはできません。そこに含まれるオーバーヘッドについてはよくわかりません。これはかなり深いOSレベルのコードです。
対照的に、あなたが電話するときacquireContentProviderClient(authority)
、それは「私は何を提供する必要がありますか?」ルックアップは1回実行され、ContentProviderClient
基本的にへの直接リンクであるが与えられますContentProvider
。(クロススレッド通信と同時実行ロックを含む、あなたとプロバイダーの間には少し接着剤があります)。ただし、を使用する場合はContentProviderClient
、要求した権限についてプロバイダーに直接問い合わせます。これにより、「どのプロバイダーが必要ですか?」を絶えず再計算する無駄がなくなります。
注:acquireContentProviderClient()ドキュメントごと:ContentProviderClientを取得する場合、「呼び出し元は、ContentProviderClient.release()を呼び出して、プロバイダーで完了したことを示す必要があります。これにより、システムはプロバイダーを解放できるようになり、他にプロバイダーがないと判断されます。それをアクティブに保つ理由。」 したがって、基本的に、古いクライアントを開いたままにすると、プロバイダーはバックグラウンドでサービスとして実行され続けるようになります。だから、クリーンアップすることを忘れないでください!
概要:
さまざまなcontentAuthoritiesへの多くの呼び出し: を使用しContentResolver
ます。
同じ機関への繰り返しの呼び出し: を取得して使用しますContentProviderClient
。完了したら、必ずrelease()してください。