Должен ли я использовать Cursor или CursorLoader?

У меня есть приложение для Android, в котором у меня есть система входа в систему и некоторые другие вещи, которые взаимодействуют с сервером. Иногда я просто получаю от веб-сервера только подтверждение, а иногда я получаю много данных. До сих пор я использовал простую базу данных. Сегодня я реализовал Content Provider, который работает до сих пор. Чтобы получить данные от ContentProvider, я использовал этот Cursor cursor = getContentResolver().query();, но я увидел, что есть также возможность использовать CursorLoader. В чем разница между ними? Что в моем случае использовать? Я также видел, что я должен реализовать его в каждом классе cursorLoader, не могу ли я создать для него один класс и вызывать его, когда это необходимо?


person Bogdan Daniel    schedule 02.06.2015    source источник
comment
Включает ли ваше приложение обновление данных в реальном времени?   -  person siriscac    schedule 03.06.2015


Ответы (1)


Как указано в документации,

CursorLoader реализует протокол Loader стандартным способом для запроса курсоров, опираясь на AsyncTaskLoader для выполнения запроса курсора в фоновом потоке, чтобы он не блокировал пользовательский интерфейс приложения.

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

  1. Они обеспечивают асинхронную загрузку данных.
  2. Они отслеживают источник своих данных и предоставляют новые результаты при изменении содержимого.
  3. Они автоматически переподключаются к последнему курсору загрузчика при воссоздании после изменения конфигурации. Таким образом, им не нужно повторно запрашивать свои данные.

Если вы используете курсоры по умолчанию, запрашивая контент-провайдер напрямую, вам нужно обрабатывать их закрытие, и, как вы сказали, у вас огромные данные, вам придется запускать код запроса в другом потоке. Для всех этих целей использование CursorLoaders намного проще и эффективнее. Чтобы узнать, как его использовать, ознакомьтесь с этим.

Что касается вашего второго вопроса,

Я также видел, что я должен реализовать его в каждом классе cursorLoader, не могу ли я создать для него один класс и вызывать его, когда это необходимо?

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

person Antrromet    schedule 02.06.2015
comment
Спасибо. Я понимаю их лучше из вашего ответа. Не могли бы вы привести пример того, как сделать последнюю часть, учебник или что-то в этом роде? - person Bogdan Daniel; 03.06.2015
comment
А для простой задачи, когда я не получаю много данных, должен ли я просто использовать курсор? - person Bogdan Daniel; 03.06.2015
comment
Простой пример использования базового класса можно найти здесь. Я лично использую Loader всякий раз, когда задействован контент-провайдер, потому что его можно легко масштабировать. Также можно не беспокоиться о закрытии курсоров и забивании памяти. - person Antrromet; 03.06.2015