В каком потоке работает ContentProvider? - PullRequest
19 голосов
/ 16 августа 2010

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

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

Ответы [ 2 ]

21 голосов
/ 26 августа 2010

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

  1. В этом примере я предполагаю, что ваш ContentProvider живет в одном процессе, а ваша активность - в другом процессе.

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

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

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

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

Пояснение:

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

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

  2. Ваш 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

5 голосов
/ 31 января 2013

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

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

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

...