MVP模式在实际开发中的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ethanhola/article/details/54589746

业务逻辑写的越来越多,越来越复杂,将业务逻辑都放到Activity中写当时可能觉得很爽,因为写的随意,写的速度也快,但是后期维护很困难,交接项目的成本也很高。MVP模式应运而生。

MVP原理

M指代model,用于存放数据的模型,用于Json解析、缓存等。
V指代View,通常意义上的Android视图,由于静态的view功能太少,需要Activity控制,这里将Activity视为View,进行视图的刷新、可见性等的控制。
P指代Presenter,任命者,去处理各种业务上的逻辑,处理完成后通知View,View根据返回结果更新UI。

本质上来说,MVP模式是通过接口层将UI和业务逻辑分离。UI不关心具体的业务逻辑,业务逻辑不关心UI怎么显示。一个MVP的实例可以不含有model,但是一定会有view和presenter。

实例

本例模拟从网络抓取数据的场景
工程目录如下:

Paste_Image.png

BaseView.java

public interface BaseView<T> {    
    void setPresenter(T t);
}

BasePresenter.java

public interface BasePresenter {
   void destroy();
}

以上两个类是基础的类,将来app里的所有V和P都可以继承它们。

IMainView.java

public interface IMainView extends BaseView<IMainPresenter>{    
        void showErrorMsg(String str);      
        void showNetResult(InfoModel model);
}

这个接口定义了UI层需要处理的两个动作,显示错误信息和显示请求结果。

IMainPresenter

public interface IMainPresenter extends BasePresenter{    
    void getInfoFromNet(int who);
}

这个接口定义了业务逻辑层需要处理的逻辑,从网络获取信息。

public class MainActivity extends AppCompatActivity implements IMainView {private IMainPresenter mPresenter;
​
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       //初始化presenter
       mPresenter = new MainPresenter(this);
       mPresenter.getInfoFromNet(1);
   }
​
   @Override
   public void showErrorMsg(String str) {
       Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
   }
​
   @Override
   public void showNetResult(InfoModel model) {
       Toast.makeText(this, model.result, Toast.LENGTH_SHORT).show();
   }
​
   @Override
   public void setPresenter(IMainPresenter iMainPresenter) {
       this.mPresenter = iMainPresenter;
   }
​
   @Override
   protected void onDestroy() {
       super.onDestroy();
       //presenter回收
       if (mPresenter != null) {
           mPresenter.destroy();
       }
   }
}
​```
###MainPresenter.java
```java
​

public class MainPresenter implements IMainPresenter {
   IMainView mainView;
​
   public MainPresenter(IMainView mainView) {
       this.mainView = mainView;
       this.mainView.setPresenter(this);
   }
​
   @Override
   public void getInfoFromNet(int who) {
       System.out.println("hola " + Thread.currentThread().getId());
       if (who == 1) {
           InfoModel model = new InfoModel();
           model.code = 0;
           model.msg = "success";
           model.result = "Got information from internet.";
           mainView.showNetResult(model);
       } else {
           mainView.showErrorMsg("error here.");
       }
​
   }
​
   @Override
   public void destroy() {
       //进行必要的垃圾回收
       mainView = null;
   }
}

源码地址:https://github.com/boomstack/TestMVP

猜你喜欢

转载自blog.csdn.net/ethanhola/article/details/54589746