Intereting Posts
Ошибка: (3) Ошибка синтаксического анализа XML: неверно сформированный (недопустимый токен) Как я могу нарисовать вертикальную линию в Activity при нажатии кнопки? Мастер установки студии Android – создайте виртуальное устройство Android Android: onSaveInstanceState не вызывается из активности Android Chain Animations Android: обнаружение события click в пустое пространство gridview внутри linearlayout Android – когда звонить db.setTransactionSuccessful ()? Есть ли простой способ добавить границу к верхней и нижней части Android View? Как узнать вызывающую деятельность в android Android обнаруживает изменение URL веб-просмотра Как я могу закодировать свою игру для работы над каждым решением Android-устройств? (С единством) Уклонение от приема сообщений Google облачных сообщений не запускается (трансляция выполнения callback: result = CANCELED forIntent) Кнопка Android Custom Shape Кинжал не может найти инъекционные элементы на модуле «Вы должны использовать тему Theme.Appcompat …» при тестировании ActionBarActivity, но я

Android MVP open Activity from Presenter, анти-шаблон?

Будет ли это анти-шаблон, если с уровня Presenter я открою Activity ?

Если да, то следует ли мне управлять навигацией приложения с уровня просмотра?

Solutions Collecting From Web of "Android MVP open Activity from Presenter, анти-шаблон?"

Да, это анти-mvp-шаблон. Основываясь на пассивном представлении в MVP, вы потеряли свою тестируемость, потому что вам не нужно иметь дело с инфраструктурой Android в своем презентаторе.

Так что лучше управлять навигацией приложения с уровня просмотра.

 class MyPresenter { MyPresenter.View view; void backButtonClicked() { view.navigateToHomeScreen(); } public interface View { void navigateToHomeScreen(); } } class MyActivity extends Activity implements MyPresenter.View { @Override void navigateToHomeScreen() { startActivity(...) } @OnClick(R.id.my_button) void onClick() { presenter.backButtonClicked(); } } 

Другим преимуществом этого способа является то, что будет легко заменить активность фрагментом или представлением.

Изменить 1:

Моргвай сказал, что этот путь нарушит разделение беспокойства и единоличной ответственности, но вы не можете иметь ни единой ответственности. Когда-нибудь вам нужно будет его нарушить. Вот пример из Google для MVP:

TaskDetailPresenter вызывает ShowEditTask который отвечает за открытие нового Activity внутри TaskDetailFragment .

Но также вы можете использовать CommandPattern, который является лучшим подходом

 interface NavigationCommand { void navigate(); } 

Таким образом, Presenter будет использовать его, когда это необходимо.

На мой взгляд, было бы лучше, если бы вы открыли действие из уровня просмотра. Я предпочитаю, чтобы ведущий знал о деятельности как можно меньше.

Если есть какое-то условие того, какая деятельность должна быть запущена, вы можете использовать что-то вроде этого:

 public class Presenter { private ViewsPresentation mViewsPresentation; public void someButtonClicked() { if (/*some condition*/) { mViewsPresentation.startFirstActivity(); } else { mViewsPresentation.startSecondActivity(); } } public interface ViewsPresentation { void startFirstActivity(); void startSecondActivity(); } } 

Как я писал в своем комментарии к принятому ответу, я считаю, что управление навигацией с уровня представления является явным нарушением разделения правил: правила должны содержать ТОЛЬКО методы обновления текущего экрана пользовательского интерфейса.

Проблема связана с дизайном платформы Android, поскольку классы Activity и Fragment содержат оба метода работы на экране пользовательского интерфейса и отправки startActivity объектов, которые запускают другие действия, такие как startActivity .

Чистым способом решения этой проблемы будет создание интерфейса Navigator который будет содержать методы, связанные с навигацией, а также реализовать его и внедрить в презентаторов. Этот способ, по крайней мере, с точки зрения навигации инструкторов и манипулирования пользовательским интерфейсом будет разделен. Однако он может показаться странным с точки зрения деятельности: теперь они часто реализуют оба интерфейса (Navigator и View) и передают свою ссылку 2 раза ведущему. Если по этой причине вы решите управлять навигацией со своего уровня представления, по крайней мере, сохраните методы навигации отдельно от тех, которые используются для управления пользовательским интерфейсом: никогда не выполняйте навигацию и манипулирование пользовательским интерфейсом одним и тем же способом.