2010-08-16 5 views
18

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

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

ответ

18

Если вы имеете в виду нормального использования случая использования 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

+0

Что делать, если ваш контент-провайдер находится в том же процессе? –

+0

На самом деле это не так, они запрашивают/вставляют/обновляют/удаляют звонки, которые все еще происходят в потоках связующего, только в том же самом процессе, который вызвал вызов. Они не будут встречаться в основном потоке, потому что это может вызвать ANR. – satur9nine

+0

Так что запуск функции resolver.delete(), например, из метода onReceive() вещательного приемника, будет в основном потоке, правильно? –

5

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

Возможно, есть лучший способ сделать это, но вместо того, чтобы потратить кучу усилий rolling my own db or content provider, чтобы закрыть db и ресурсы на каждом создании, я обнаружил простую обходную задачу.

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

+2

«ContentProviders никогда не уничтожаются» - это в документации? Если нет, не полагайтесь на него. –