Подтвердить что ты не робот

Какой поток запускает ContentProvider?

Если я вызываю ContentProvider из Activity, в каком потоке работает ContentProvider?

например. Что произойдет, если активность запущена и запрос выполняется в ContentProvider? Скажем, что у вас медленный сетевой запрос f.ex.

4b9b3361

Ответ 1

Если вы имеете в виду обычный вариант использования ContentResolver для вызова ContentProvider, то вот что происходит, насколько мне известно:

  • Я предполагаю в этом примере, что ваш ContentProvider живет в одном процессе и вашей деятельности в другом процессе.

  • Если ContentProvider не был создан, метод onCreate() вызывается с использованием "основного" потока процесса приложения.

  • Методы query()/insert()/update()/delete() вызываются с помощью BinderThreads, которые сидят в каждом процессе приложения, ожидая входящих команд из других процессов.

Итак, что произойдет, если действие, вызвавшее запрос()/insert()/etc, будет убито в середине одного из этих вызовов метода? Я не могу сказать наверняка, но я уверен, что все, что происходит в ContentProvider, будет продолжаться, потому что процесс ContentProvider должен оставаться незатронутым, но что происходит после того, как этот метод возвращается, я не могу сказать наверняка.

Я не уверен, насколько медленная сеть будет задействована в этом вообще, если ваш контент-провайдер не поддерживается сетью вместо обычного sqlite db?

Разъяснение:

Существует две возможности при вызове функции ContentProvider (запрос/вставка/обновление/удаление/etc):

  • Ваш ContentProvider находится в том же процессе, что и вызывающий. Если это так, функция ContentProvider выполняется синхронно в том же потоке, что и вызывающий.

  • Ваш ContentProvider находится в другом процессе как вызывающий. Если это так, то функция ContentProvider работает в потоке связующего в процессе ContentProvider.

В обоих случаях вызывающий абонент блокируется до тех пор, пока функция ContentProvider не вернется. Как всегда читайте полную документацию от Google и/или исходного кода AOSP.

http://developer.android.com/reference/android/content/ContentProvider.html http://developer.android.com/guide/topics/providers/content-provider-basics.html http://developer.android.com/guide/components/processes-and-threads.html

Ответ 2

Я наткнулся на это, устраняя проблему, когда удаленный процесс (кроме UI) в том же приложении постоянно вызывал провайдера контента каждый раз, когда он выполнял запрос. К сожалению, если вы не пишете что-то обычное, ContentProviders никогда не уничтожаются до тех пор, пока выполняется процесс. Поставщик контента обычно работает в потоке процесса пользовательского интерфейса (который не был открыт), поэтому в этом случае с удаленным процессом, запрашивающим contentprovider, он будет порождать новый экземпляр contentprovider для каждого запроса, потому что этот отдельный процесс (поток пользовательского интерфейса) был не работает в то время.

Возможно, есть лучший способ сделать это, но вместо того, чтобы тратить кучу усилий на прокат моего собственного db или поставщика контента, чтобы закрыть db и ресурсы на каждом create, я обнаружил простую обходную процедуру.

Оказывается, такая же способность работать в отдельном процессе, как это делает сервис. Поэтому в моем примере я просто переместил контент-провайдера в тот же процесс, в котором находился удаленный сервис. Проблема решена, теперь поставщик контента работает в одном процессе и только размножается один раз до тех пор, пока работает служба. Также проверьте android: мультипроцессорный атрибут.