ContentProvider Threading - PullRequest
       9

ContentProvider Threading

4 голосов
/ 06 марта 2012

Просто любопытно.

getContentResolver().query(...)

Я знаю, что загрузчики запускают запросы в фоновых потоках.Относится ли это также к вставкам, обновлениям и удалениям?Должен ли я создавать AsyncTasks, Threads и т. Д. Для таких вызовов?Большие обновления могут блокировать основной поток моего приложения.

getContentResolver().insert(...)

Спасибо!

Ответы [ 3 ]

5 голосов
/ 02 августа 2013

из Основы контент-провайдера

Получение данных от провайдера

В этом разделе описывается, как получить данные от поставщика, используя Поставщик словаря пользователя в качестве примера.

Для ясности фрагменты кода в этом разделе вызывают ContentResolver.query () в «потоке пользовательского интерфейса». Однако в реальном коде Вы должны выполнять запросы асинхронно в отдельном потоке . Один из способов сделать это, чтобы использовать класс CursorLoader, который описан в более подробно в руководстве по погрузчикам. Кроме того, строки кода являются фрагментами только; они не показывают полное приложение.

2 голосов
/ 07 апреля 2015

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

Помимо загрузчика, доступного начиная с Android 3.0, android предоставил вспомогательный класс AsyncQueryHandler , начиная с уровня API 1, для асинхронных CRUD-подобных операций с поддержкой полных обратных вызовов CRUD.

AsyncQueryHandler работает внутри с HandlerThread для асинхронных операций и доставляет результаты обратно в основной поток.Использование AsyncTask или простых рабочих потоков также является популярной практикой с точки зрения особых требований.

1 голос
/ 07 апреля 2015

Когда вы говорите, что Loaders запускает запросы в фоновых потоках, вы должны понимать, что именно реализации класса Loader выполняют запросы в фоновом потоке.

Следствием этого является то, что вы захотите использовать или расширять и реализовывать подклассы абстрактного класса Loader, а не использовать потоки AsyncTask или Java. Причина в том, что когда вы создаете Loader, он ожидает, что вы вернете экземпляр типа Loader. Для этого нельзя использовать поток Java или AsyncTask. Подклассы класса Loader делают это, начиная свой собственный поток. Клиентский класс или класс, который создает Loader, только инициализирует Loader. Фактический экземпляр Loader может делать все, что вы хотите. Это может быть что угодно - вставить, обновить, удалить и т. Д. Предоставленная Android реализация CursorLoader асинхронно запрашивает данные из таблиц в фоновом потоке и возвращает набор результатов. Android не предоставляет аналогичные собственные реализации для вставки или обновления данных. То, что у вас есть, это возможность расширения из AsyncTaskLoader (того же класса, от которого наследуется CursorLoader).

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

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

...