Intereting Posts
Выполнить Javascript в HTML-файле с помощью Android «Поток не представляет собой хранилище ключей PKCS12» после сохранения с нового пароля на устройстве Android Выполнение аудио цикла на Android Странное поведение измерений магнитного поля при вращении устройства Android: как периодически отправлять местоположение на сервер Как избежать черного экрана при запуске, когда установлен FLAG_ACTIVITY_CLEAR_TASK? TYPE_ROTATION_VECTOR, TYPE_ORIENTATION дают разные результаты, которые тоже с отклонениями Открывается автоматическая всплывающая клавиатура Android Как я могу использовать распознавание речи без раздражающего диалога на телефонах Android Iconfont charachterspace рушится в Android (Fontastic) Каково максимальное количество эмуляторов Android, работающих с Intel HAXM на одном ПК? Как сделать активность, не охватывая весь экран Несовместимые типы в методе onCreateLoader, работающие с AsyncTaskLoader и фрагментом Как решить «Не удалось запустить mksdcard SDK tool» при установке Android Studio на Fedora 21? Поиск Android SDK на Mac и добавление в PATH

Трудности с использованием Model-View-Presenter в Android

Model-View-Presenter (MVP) является хорошо известным шаблоном проектирования для графических приложений. Для Android реализация бизнес-логики в простом Java-модуле облегчает тестирование без необходимости использования эмулятора Android.

Однако у меня возникают трудности с внедрением шаблона на Android из-за особых требований к графическому интерфейсу приложений для Android:

Я прочитал сообщение в блоге MVP для Android и посмотрел пример исходного кода . Конечной целью, которую я пытаюсь достичь с помощью шаблона MVP, является возможность перевести всю бизнес-логику на Objective-C с помощью transpiler j2objc , чтобы бизнес-логику можно было повторно использовать при реализации того же приложения в iOS.

Есть ли кто-нибудь, кто успешно реализовал шаблон MVP для Android, и в этом случае, что мне не хватает?

Solutions Collecting From Web of "Трудности с использованием Model-View-Presenter в Android"

Я предлагаю реализовать компонент MVP без привлечения Activity, возможно, концептуально думая о том, что было бы полезно как для Android, так и для GWT. Создайте компонент с помощью тестовой разработки с помощью посмеянного интерфейса View, добавив тесты, пока бизнес-логика не будет полностью реализована и проверена. TDD помогает поддерживать API-интерфейс компонента (зачем писать тесты на то, что вам не нужно?), Что упрощает перенос компонента.

Описанные требования к деятельности могут быть обобщены как независимые от платформы: компонент должен быть сериализуемым (малым, а не сериализацией Java) и должен принимать события состояния жизненного цикла. Те же могут быть полностью протестированы с использованием mocks для системных функций. По мере прохождения этого шага вы, вероятно, заметите, что некоторые из требований Activity обязательно зависят от Android и могут быть полезны на других платформах. Избегайте создания огромных сервисных API; Для поддержки сериализации, например, все, что необходимо, это методы хранения / загрузки, а не что-то вроде API-интерфейса Parcel . Я нашел описание таких сервисных API другому разработчику на доске, чтобы стать отличным способом найти ненужный пух.

Затем портируйте компонент на Android, возможно, создав Activity, который делегирует компоненту и предоставляет классы реализации Android для издевающихся интерфейсов. Все должно «работать» в первый раз, но на самом деле некоторые требования могут быть упущены, поэтому добавьте их в независимую от платформы часть и повторите.

Когда вы будете готовы к подключению к iOS, переопределите те ранее издевавшиеся интерфейсы. Если эти интерфейсы бывают скудными, их, вероятно, будет проще создавать непосредственно в Objective-C, импортируя заголовки протокола, сгенерированные j2objc. Например, класс NSDictionaryMap j2objc реализует java.util.Map с реализацией NSDictionary – нет необходимости писать и переводить версию Java с момента ее использования только API-интерфейсов iOS.

Я нахожу, что вариант MVP Android построен вокруг – это шаг в правильном направлении для изоляции бизнес-логики в приложении. Однако, если вы хотите добиться лучшего разделения проблем и, как результат, более многократно используемого домена / бизнес-логики, я рекомендую использовать шаблон Presenter First (который вы кратко упомянете о себе в комментарии). Помимо уменьшения связи, он хорошо поддается TDD и позволяет вам тестировать всю вашу бизнес-логику.

Недавно я начал репо с GitHub с примерами Presenter First для Android. Из-за сложности архитектуры Android не так просто реализовать шаблон. Представления, как правило, «более толстые», чем то, что кажется приемлемым в обычном приложении Presenter First, в основном из-за жизненного цикла деятельности и других странностей, как вы упоминаете сами. Я сделал все возможное, чтобы отделить бизнес-логику от платформы, но есть определенная возможность для улучшения. Вы можете найти примеры:

http://github.com/olerass/presenter-first-android

Может быть, вы можете использовать некоторые идеи оттуда? Или даже лучше внести свой вклад.