Ваше устройство Android имеет много баз данных, каждая из которых идентифицируется уникальным Content Authority. Это эквивалентная часть «доменного имени» в содержимом: // uri - все до первой косой черты.
ContentResolver
хранит данные с отображением от String contentAuthority
до ContentProvider
. Когда вы вызываете ContentResolver.query()
или update()
или что-то еще, URI разбирается на его компоненты, строка contentAuthority идентифицируется, и contentResolver должен найти на этой карте соответствующую строку и направить запрос нужному поставщику. , Этот дорогостоящий поиск происходит во время каждого отдельного вызова, потому что URI может отличаться от вызова к вызову, но также с другим contentAuthority. Кроме того, могут быть некоторые затраты, связанные с установлением и разрывом соединения с этим конкретным провайдером - его нельзя использовать повторно во всех вызовах. Я не уверен в накладных расходах, это довольно глубокий код уровня ОС.
В отличие от этого, когда вы звоните acquireContentProviderClient(authority)
, что "какой провайдер мне нужен?" поиск выполняется один раз, и вы получаете ContentProviderClient
, который по сути является прямой ссылкой на ContentProvider
. (Между вами и провайдером есть немного клея, который включает межпотоковое взаимодействие и параллелизм). Однако, когда вы используете ContentProviderClient
, вы будете напрямую обращаться к поставщику за запрашиваемыми вами полномочиями. Это избавляет от необходимости постоянно пересматривать "какой провайдер мне нужен?"
ПРИМЕЧАНИЕ: За документация acquContentProviderClient () : если вы получаете ContentProviderClient, "Вызывающий должен указать, что он сделал с провайдером, вызвав ContentProviderClient .release () , который позволит системе освободить провайдера, если он определит, что нет других причин сохранять его активным. " Таким образом, если оставить устаревшего клиента открытым, то Провайдер будет продолжать работать как сервис в фоновом режиме. Итак, не забудьте убрать!
Резюме:
Множество звонков с различным контентом. Полномочия: Использование ContentResolver
.
Повторные вызовы в один и тот же орган: Получить и использовать ContentProviderClient
. Не забудьте отпустить (), когда закончите.