Если вы имеете в виду нормального использования случая использования ContentResolver вызвать ContentProvider то вот то, что происходит в соответствии с лучшим из моих знаний:
я предполагаю, что в этом примере вашей ContentProvider живет в один процесс и ваша деятельность в другом процессе.
Если ContentProvider не был создан, метод onCreate() вызывается с использованием «основного» потока процесса приложения.
Методы query()/insert()/update()/delete() вызываются с использованием BinderThreads, которые сидят в каждом процессе приложения, ожидая входящих команд из других процессов.
Итак, что произойдет, если действие, вызвавшее запрос()/insert()/etc, погибло в середине одного из этих вызовов метода? Я не могу сказать наверняка, но я уверен, что все, что происходит в ContentProvider, будет продолжаться, потому что процесс ContentProvider должен оставаться незатронутым, но что происходит после того, как этот метод возвращается, я не могу сказать наверняка.
Я не уверен, насколько медленная сеть будет задействована в этом вообще, если ваш контент-провайдер не поддерживается сетью, а не обычным sqlite db?
Разъяснение:
Есть две возможности при вызове функции ContentProvider (запрос/вставки/обновления/удаления/и т.д.):
Ваш 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
Что делать, если ваш контент-провайдер находится в том же процессе? –
На самом деле это не так, они запрашивают/вставляют/обновляют/удаляют звонки, которые все еще происходят в потоках связующего, только в том же самом процессе, который вызвал вызов. Они не будут встречаться в основном потоке, потому что это может вызвать ANR. – satur9nine
Так что запуск функции resolver.delete(), например, из метода onReceive() вещательного приемника, будет в основном потоке, правильно? –