ContentProvider Резьбонарезной

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

getContentResolver().query(...) 

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

 getContentResolver().insert(...) 

Благодаря!

От основ поставщика контента

Получение данных от поставщика

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

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

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

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

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

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

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

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

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

Intereting Posts