Intereting Posts
Android Fatal signal 11 (SIGSEGV) при 0x00000040 (код = 1) Ошибка Компиляция Lua lib для Android – успех, но странные segfaults Как создать четкое фоновое изображение для виджета Android 1×1? Не удается импортировать проекты в рабочее пространство Eclipse Получение неопределенной ссылки на stdout, stderr при компиляции с использованием цепочки инструментов x86 для Android NDK Добавление нового сетевого носителя на Android Есть ли способ получить частоту обновления дисплея программно? Динамическое использование setImageDrawable для установки изображения в ImageView Заголовок списка Android Android – Мигающее изображение с использованием анимации Alpha fade Получение строк из курсора в Android? Как добавить кнопки нижнего колонтитула в NavigationView Как сохранить ExpandableListView в расширенном состоянии? Значение RGB для HSL-конвертера Проверка Android TTS для поддерживаемой локали с отсутствующими / не загруженными речевыми данными

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

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

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

Solutions Collecting From Web of "Какой поток запускает ContentProvider?"

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

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

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

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

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

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

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

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

  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. ком / руководство / компоненты / процессы-и-threads.html

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

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

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