В моем приложении мне нужно много продуктов CRUD: читать записи из локальной базы данных SQLite, вставлять объекты и обновлять материалы. Большинство запросов настолько просты, что они не будут блокироваться, даже если они запускаются в потоке пользовательского интерфейса, однако в этом приложении я хочу использовать шаблон Windows Phone: анимация с анимацией началась сразу же, а анимация началась, когда результат был доставлен.
Я планировал использовать AsyncTask
для работы, однако я заметил, что Honeycomb (и пакет compat) представляет новую инфраструктуру Loader . Основным преимуществом является то, что данные, загруженные конфигурацией Loader
изменяются. Проект LoaderEx от Commonsware мосты между SQLite и инфраструктурой, но возникают некоторые проблемы.
Очистка ресурсов: я использую одно действие, создаю SQLiteOpenHelper в onCreate()
и закрываю его onDestroy()
. Поскольку диспетчер загрузчика все еще может работать, я проверяю его и устанавливаю флаг pendingClose
на свой объект callbacks, поэтому он закрывает курсор и помощник при завершении загрузки. Я думаю, что закрытие базы данных не вредно, но SQLite жалуется, если вы этого не делаете, и мне не нравятся сообщения об ошибках 🙂 Дело здесь в том, что данные не выдерживают изменения конфигурации, поэтому преимущество Loader исчезает
Сколько загрузчиков я должен создать? Предположим, у меня есть любимые таблицы Customer
и заказов. Погрузчики идентифицируются идентификаторами, такими как CUST_L
или ORD_L
, но каждый раз, когда пользователь нажимает на некоторое резюме, я хочу, чтобы на экране появился деталь. Должен ли я restart
загрузчик с разными параметрами, или мне нужно создать новый со случайным идентификатором? Это может произойти десятки раз. Рамка Loader предназначена для множества небольших рабочих заданий или просто для нескольких длительных задач?
Какова цель использования ID
внутри интерфейса LoaderCallbacks
? Почему не простой initLoader(params, callback)
? Я не думаю, что в обратном вызове можно повторить часть логики: в конце концов он будет ветвиться (с if-else
или switch
идентификатор), поэтому я не понимаю, как указать идентификатор объекта callbacks, а не Наивный подход к одному обратному вызову .
Я спрашиваю об этом, потому что вся структура кажется слишком сложной для меня и без реальной полезности. Я не понимаю, как централизовать код с помощью LoaderManager
, и я не вижу никакой новой возможности, которую AsyncTask
не предлагал.
Единственная точка выигрыша – это изменение конфигурации, но я не могу использовать ее из-за очистки ресурсов, и я не могу найти альтернативный способ закрыть SQLiteOpenHelper
потому что (совершенно очевидно), что требует SQLiteCursorLoader
но очистка его вверх Для пользователя. Итак, AsyncTask
кажется здесь победителем, но, может быть, я что-то упустил.
Мой опыт показывает, что, несмотря на то, что использование Content Providers звучит как излишество для реализации, в действительности оно действительно окупается в будущем. Снижение производительности незначительно (попробовали измерить его), привязки UI-Data добавлены из коробки (из-за того, что контент-наблюдатель и CursorLoaders могут подписаться на уведомления Uri), синхроничность, реализуемая инфраструктурой через загрузчики. IMHO, всякий раз, когда нужна база данных, чаще всего используется контент-провайдер с загрузчиками, это лучшее решение, которое вы можете придумать.
Другие сценарии, связанные с использованием базы данных напрямую, заставят вас реализовать все вручную.