Ответ 1
почему Плохогрузчики и почему их следует избегать
Вы заметите, что это не то, что я сказал. Я сказал, что загрузчики - неудачная абстракция. Там разница.
Общая рекомендация при создании структуры для значительного повторного использования заключается в разработке и создании трех дискретных реализаций структуры. Если ваша инфраструктура может поддерживать три разных подхода, дизайн, вероятно, достаточно гибкий, чтобы обрабатывать будущие реализации.
Структура Loader
, в конце дня, предназначена для одной реализации: CursorLoader
. Период. Других конкретных реализаций Loader
в SDK нет. В частности, структура Loader
имеет контракт, который требует, чтобы реализации Loader
могли автоматически обновлять результаты. Хотя это прекрасный контракт с точки зрения пользователей структуры Loader
, это затрудняет задачу для тех, кто может создавать реализации структуры Loader
.
Я попытался создать две отдельные реализации структуры Loader
для SQLite и SharedPreferences
(три, если вы считаете SQLCipher для Android отдельно). SQLite отстой, потому что единственный способ сделать перезагрузку - это Loader
знать, что нужно перезагрузить, что неудобно. Использовался SharedPreferences
, но было указано, что в настоящее время onLoadFinished()
не будет вызываться, если объект, представляющий результаты (Cursor
для a CursorLoader
, SharedPreferences
для SharedPreferencesLoader
), является тот же объект, что и раньше. Это разбивает SharedPreferencesLoader
, так как объект SharedPreferences
обновляется in situ при изменении настроек.
После написания моих реализаций Loader
и использования их немного, я пришел к выводу, что они не стоят того. Я предпочел бы загружать материал сам асинхронно с помощью AsyncTask
или IntentService
и использовать шину сообщений (Otto, greenrobot EventBus и т.д.) Для уведомления заинтересованных сторон об изменениях в данных. Хотя я мог бы обернуть это содержимое внутри Loader
, я не уверен, что он разрешит достаточно проблем, чтобы приложить все усилия.
Теперь, если вы используете ContentProvider
и хотите использовать CursorLoader
, это прекрасно. У него могут быть свои проблемы, но, по крайней мере, он должен работать.
Что касается библиотеки CWAC-LoaderEx, я прекращаю ее, потому что:
-
У меня только так много часов в день, и поэтому, как часть большой AAR-идентификации библиотек CWAC, я решаю, какие библиотеки стоят усилий для поддержки
-
Я не использую CWAC-LoaderEx лично, за пределами нескольких примеров книг
-
CWAC-LoaderEx зависит от слишком большой внутренней реализации
Loader
для меня, чтобы быть удобным, что я смогу сохранить его работу в течение длительного времени (см.SharedPreferencesLoader
)
CWAC-LoaderEx никуда не денется, но я просто не буду вкладывать в него больше времени. Если кто-то с поддерживаемой/расширенной вилкой свяжется со мной, я с удовольствием свяжусь с их вилкой из проекта README.
Я также хотел бы узнать о других лучших альтернативах Loaders
Все a Loader
- это асинхронно загружать контент, повторно загружать этот контент при обнаруженном изменении содержимого и сохранять указанный контент при изменении конфигурации. Оставшийся (или безголовый) фрагмент модели может делать то же самое, в сочетании с AsyncTask
.