Intereting Posts
Прозрачная панель инструментов Android над ImageView Закрытие фрагмента автозаполнения Android Place самостоятельно Кто-нибудь еще заметил белый экран, который создает переход с окна слайдов при его запуске? Вернуться к предыдущей деятельности с намерением Как определить дату синтаксиса в Java? Некоторая путаница в форматах дат Android In-App Billing – queryInventoryAsync возвращает 0 результат Создание проекта Android с муравьем, имеющим проект библиотеки в зависимости от другого проекта библиотеки Удаление смс из папки «Входящие» GCM и приложение для чата Элемент списка ListView с помощью настраиваемого селектора Платформы для эмулятора Android – Есть ли инструменты и спецификация? Android: использование матрицы для рисования растровых изображений Ошибка: не удалось разрешить: annotationProcessor Функция Android NDK __android_log_print andLogCat Файл ввода типа веб-просмотра Android

Поставщики контента Android – sqlite и многопоточность

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

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

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

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

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

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

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

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

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

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