Android - поставщики контента sqlite и многопоточность - PullRequest
6 голосов
/ 02 августа 2011

Я немного запутался в поставщиках контента. Если у меня есть несколько действий в моем приложении, каждый из них получает свой собственный экземпляр поставщика контента? это просто по сути класс / интерфейс?

В одном упражнении у меня будет много потоков, одновременно пишущих в базу данных. Как я могу разрешить писать одному потоку за раз?

Должен ли я просто перехватить исключение SQLiteDatabaseLockedException, перевести поток в спящий режим и повторить попытку? Или есть лучший способ?

Блокируются ли базы данных, когда действие приостанавливается / уничтожается? Если так, могу ли я просто создать синхронизированную блокировку для самого провайдера контента?

Ответы [ 3 ]

3 голосов
/ 09 июня 2012

Если вы работаете напрямую с базами данных и у вас несколько писателей из разных потоков, у вас могут возникнуть проблемы с параллелизмом.

Доступ к ContentProvider возможен из нескольких программ одновременно, поэтому вы должны реализовать потокобезопасный доступ. Самый простой способ - использовать ключевое слово synchronized перед всеми методами ContentProvider, чтобы только один поток мог получить доступ к этим методам одновременно.

Если вам не требуется, чтобы Android синхронизировал доступ к данным с ContentProvider, задайте атрибут android:multiprocess=true в определении <provider> в файле AndroidManifest.xml. Это позволяет создавать экземпляр провайдера в каждом клиентском процессе, устраняя необходимость выполнения межпроцессного взаимодействия (IPC).

1 голос
/ 02 августа 2011

Ой, я потерял свой незарегистрированный файл cookie пользователя, поэтому не могу правильно ответить на вопрос Femi.

Документация http://developer.android.com/guide/topics/providers/content-providers.html подтверждает это: «Когда запрос инициирован, система Android идентифицирует контентПоставщик является целью запроса и гарантирует, что он запущен и работает. Система создает экземпляры всех объектов ContentProvider, вам никогда не нужно делать это самостоятельно. Фактически, вы вообще никогда не имеете дело с объектами ContentProvider напрямую. Как правило, естьтолько один экземпляр каждого типа ContentProvider. Но он может взаимодействовать с несколькими объектами ContentResolver в различных приложениях и процессах. Взаимодействие между процессами осуществляется классами ContentResolver и ContentProvider. "

0 голосов
/ 02 августа 2011

Если вы используете ContentProvider, я думаю, вам все равно, сколько потоков читает / пишет: платформа Android обрабатывает все ваши вызовы в одном потоке и сортирует синхронизацию и блокировки.Вы просто открываете свою базу данных и читаете / пишете в нее, а все остальные общаются через интерфейс ContentProvider.

...