如果从演示者层我打开一个活动,它会是一个反模式吗?
如果是这样,我应该从视图层管理应用程序的导航吗?
解决方法
是的,这是一个反mvp模式.基于MVP中的
passive view,您失去了可测试性,因为您不必在演示者中处理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:
Morgwai表示这样会打破分离关注和单一责任,但是你不能在每一个地方都有单一的责任.有时你需要违反它.以下是Google for MVP的一个例子:
TaskDetailPresenter
调用ShowEditTask
,它负责在TaskDetailFragment中打开一个新的Activity.
但也可以使用CommandPattern这是一个更好的方法
interface NavigationCommand { void navigate(); }
所以,Presenter会在需要的时候使用它.