Подтвердить что ты не робот

Почему плохой загрузчик в Android

Я прочитал пару твитов и комментариев здесь и там о том, что Loaders плохие, и использовать их - хороший способ "застрелить себя в лицо". Также commonsguy объявил о том, что он прекратит любую работу над своей библиотекой: Loaderex. Commonsguy также сказал: "Погрузчики - это неудачная абстракция".

Мне явно не хватает чего-то здесь, и я хотел бы узнать больше и понять, почему Плоттеры плохо, и почему их следует избегать.

Примечание. Я создал приложение для Android (возможно, из средней сложности), где я использую Loaders и не имел никаких проблем с Loaders. Вот почему это меня озадачило.

Я также хотел бы узнать о других лучших альтернативах для Loaders. Спасибо заранее

4b9b3361

Ответ 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.