Рамка загрузчика vs plain AsyncTask

В моем приложении мне нужно много продуктов CRUD: читать записи из локальной базы данных SQLite, вставлять объекты и обновлять материалы. Большинство запросов настолько просты, что они не будут блокироваться, даже если они запускаются в потоке пользовательского интерфейса, однако в этом приложении я хочу использовать шаблон Windows Phone: анимация с анимацией началась сразу же, а анимация началась, когда результат был доставлен.

Я планировал использовать AsyncTask для работы, однако я заметил, что Honeycomb (и пакет compat) представляет новую инфраструктуру Loader . Основным преимуществом является то, что данные, загруженные конфигурацией Loader изменяются. Проект LoaderEx от Commonsware мосты между SQLite и инфраструктурой, но возникают некоторые проблемы.

  1. Очистка ресурсов: я использую одно действие, создаю SQLiteOpenHelper в onCreate() и закрываю его onDestroy() . Поскольку диспетчер загрузчика все еще может работать, я проверяю его и устанавливаю флаг pendingClose на свой объект callbacks, поэтому он закрывает курсор и помощник при завершении загрузки. Я думаю, что закрытие базы данных не вредно, но SQLite жалуется, если вы этого не делаете, и мне не нравятся сообщения об ошибках 🙂 Дело здесь в том, что данные не выдерживают изменения конфигурации, поэтому преимущество Loader исчезает

  2. Сколько загрузчиков я должен создать? Предположим, у меня есть любимые таблицы Customer и заказов. Погрузчики идентифицируются идентификаторами, такими как CUST_L или ORD_L , но каждый раз, когда пользователь нажимает на некоторое резюме, я хочу, чтобы на экране появился деталь. Должен ли я restart загрузчик с разными параметрами, или мне нужно создать новый со случайным идентификатором? Это может произойти десятки раз. Рамка Loader предназначена для множества небольших рабочих заданий или просто для нескольких длительных задач?

  3. Какова цель использования ID внутри интерфейса LoaderCallbacks ? Почему не простой initLoader(params, callback) ? Я не думаю, что в обратном вызове можно повторить часть логики: в конце концов он будет ветвиться (с if-else или switch идентификатор), поэтому я не понимаю, как указать идентификатор объекта callbacks, а не Наивный подход к одному обратному вызову .

Я спрашиваю об этом, потому что вся структура кажется слишком сложной для меня и без реальной полезности. Я не понимаю, как централизовать код с помощью LoaderManager , и я не вижу никакой новой возможности, которую AsyncTask не предлагал.

Единственная точка выигрыша – это изменение конфигурации, но я не могу использовать ее из-за очистки ресурсов, и я не могу найти альтернативный способ закрыть SQLiteOpenHelper потому что (совершенно очевидно), что требует SQLiteCursorLoader но очистка его вверх Для пользователя. Итак, AsyncTask кажется здесь победителем, но, может быть, я что-то упустил.

  1. Поставщики контента гораздо более мощные, чем подход «raw-DB». Многие ссылки на stackoverflow приводят к обсуждению этого вопроса.
  2. LoaderManager пытается отличить загрузчиков по своим идентификаторам (почему подпись initLoader указывает этот аргумент). ID для загрузчика необходим для повторной доставки кэшированного результата в случае, если данные для загрузчика с определенным идентификатором уже существуют (следовательно, нет необходимости асинхронно повторно загружать его снова).
  3. RestartLoader вызывает Forceer LoaderManager для запуска асинхронной операции, указанной ранее созданным загрузчиком. InitLoader пытается повторно использовать существующий загрузчик перед созданием нового.
  4. Фрагменты и действия имеют свои собственные LoaderManagers, которые не перекрываются.

Мой опыт показывает, что, несмотря на то, что использование Content Providers звучит как излишество для реализации, в действительности оно действительно окупается в будущем. Снижение производительности незначительно (попробовали измерить его), привязки UI-Data добавлены из коробки (из-за того, что контент-наблюдатель и CursorLoaders могут подписаться на уведомления Uri), синхроничность, реализуемая инфраструктурой через загрузчики. IMHO, всякий раз, когда нужна база данных, чаще всего используется контент-провайдер с загрузчиками, это лучшее решение, которое вы можете придумать.

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