Intereting Posts
Проблемы с Android при воспроизведении аудиофайла Отображение навигационных карт в действии Вход в приложение для Android Google Analytics V2 – IllegalStateException – можно инициализировать inCreate () вместо onStart () Перечисление папок и файлов с помощью Google Drive SDK V2 Любой способ запуска программ оболочки на android программно? Как сделать приложение для Android доступно как для планшетов, так и для pre 11 sdk? Есть ли способ автоматически генерировать геттеры и сеттеры в Eclipse? Установить выравнивание текста в центре в spinner в android Нет драйвера для Asus MeMO Pad для отладки приложения с помощью eclipse Как отличить макет для разрешения экрана 480 * 800 и 480 * 854 в Android? Как установить адаптер в случае нескольких текстовых просмотров для списка? Безопасное удаление активности Android Ошибка запуска Android Studio v1.2.0: java.lang.NullPointerException Глубокая привязка неспособна отступить на рынок google?

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

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

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

  • Активность может быть уничтожена в любой момент (входящий вызов, пользователь нажимает кнопку «домой» …), а при воссоздании он должен находиться в том же состоянии, что и при его оставлении. Это не похоже на большинство других графических приложений.

  • Активность может проходить через многие состояния жизненного цикла. Он может быть приостановлен, и в этом случае пользовательский интерфейс Activity не должен изменяться. Если, например, некоторые данные загружаются в фоновом режиме, они не могут быть доставлены в часть просмотра MVP (Activity), если она находится в состоянии паузы. Опять же, это необычное требование.

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

Есть ли кто-нибудь, кто успешно реализовал шаблон MVP для 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

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