我正在将我的应用程序迁移到MVP.已经从这个
konmik中获取了静态演示者模式的提示
这是我简短的MVP策略.为简洁起见,删除了大部分样板和MVP监听器.这个策略帮助我定位变更证明我的后台流程.与完成活动的暂停相比,活动正常恢复正常暂停.此外,Presenter只有应用程序上下文,因此它不会保留活动上下文.
我不是一名java专家,这是我第一次涉足MVP并使用静态演示者让我感到不舒服.我错过了什么吗?我的应用程序工作正常,响应速度更快.
视图
public class MainActivity extends Activity{ private static Presenter presenter; protected void onResume() { if (presenter == null) presenter = new Presenter(this.getApplicationContext()); presenter.onSetView(this); presenter.onResume(); } protected void onPause() { presenter.onSetView(null); if(isFinishing())presenter.onPause(); } }
主持人
public class Presenter { private MainActivity view; Context context; public Model model; public Presenter(Context context) { this.context = context; model = new Model(context); } public void onSetView(MainActivity view) { this.view = view; } public void onResume(){ model.resume(); } public void onPause(){ model.pause(); } }
模型
public class Model { public Model(Context context){ this.context = context; } public void resume(){ //start data acquisition HandlerThreads } public void pause(){ //stop HandlerThreads } }
解决方法
我会建议两件事.
>将模型,视图和演示者制作成接口.
>您的MVP视图(活动,片段或视图)应该非常简单,不需要进行测试.
>您的MVP-Presenter永远不会直接与Activity / Fragment / View交互,因此可以使用JUnit进行测试.如果您对Android Framework有依赖性,那么测试是不好的,因为您需要模拟Android对象,使用模拟器,或使用像Roboelectric这样的测试框架,这可能非常慢.
作为接口的示例:
interface MVPView { void setText(String str); } interface MVPPresenter { void onButtonClicked(); void onBind(MVPView view); void onUnbind(); }
MVPPresenter类现在不依赖于Android Framework:
class MyPresenter implements MVPPresenter{ MVPView view; @Override void bind(MVPView view){ this.view = view; } @Override void unbind() {this.view = null; } @Override void onButtonClicked(){ view.setText("Button is Clicked!"); } }
>而不是让Presenter成为一个静态类,我会把它变成一个保留片段.需要仔细跟踪静态对象,并在不需要时手动删除GC(否则会被视为内存泄漏).通过使用保留片段,可以更容易地控制演示者的生命周期.当拥有保留片段的片段完成时,保留片段也被破坏,内存可以被GC’d. See here for an example.