Если я вызываю ContentProvider из Activity, в каком потоке работает ContentProvider?
например. Что произойдет, если активность запущена и запрос выполняется в ContentProvider? Скажем, что у вас медленный сетевой запрос f.ex.
Если я вызываю ContentProvider из Activity, в каком потоке работает ContentProvider?
например. Что произойдет, если активность запущена и запрос выполняется в ContentProvider? Скажем, что у вас медленный сетевой запрос f.ex.
Если вы имеете в виду обычный вариант использования 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
Я наткнулся на это, устраняя проблему, когда удаленный процесс (кроме UI) в том же приложении постоянно вызывал провайдера контента каждый раз, когда он выполнял запрос. К сожалению, если вы не пишете что-то обычное, ContentProviders никогда не уничтожаются до тех пор, пока выполняется процесс. Поставщик контента обычно работает в потоке процесса пользовательского интерфейса (который не был открыт), поэтому в этом случае с удаленным процессом, запрашивающим contentprovider, он будет порождать новый экземпляр contentprovider для каждого запроса, потому что этот отдельный процесс (поток пользовательского интерфейса) был не работает в то время.
Возможно, есть лучший способ сделать это, но вместо того, чтобы тратить кучу усилий на прокат моего собственного db или поставщика контента, чтобы закрыть db и ресурсы на каждом create, я обнаружил простую обходную процедуру.
Оказывается, такая же способность работать в отдельном процессе, как это делает сервис. Поэтому в моем примере я просто переместил контент-провайдера в тот же процесс, в котором находился удаленный сервис. Проблема решена, теперь поставщик контента работает в одном процессе и только размножается один раз до тех пор, пока работает служба. Также проверьте android: мультипроцессорный атрибут.