TheMvp模式

2020-11-23  本文已影响0人  code希必地

1、升级版的MVP:TheMvp

具体代码可参考 https://github.com/kymjs/TheMVP
为了AndroidMVP存在的问题,我们的Activity将不再作为View层将Presenter层包含进来,而应该作为Presenter层包含一个View层进来。
使用Activity作为Presenter层的优点在于可以原封不动的使用Activity本身的生命周期去处理业务逻辑,而不用强加给另一个类。而同时作为独立的View层,我们视图可以原封不动的传递给Presenter层,而不需修改任何代码。而随着业务逻辑的变化对View的更改,只需要通过Presenter层包含的一个代理对象(ViewDelegate)来操作相应的修改即可,而不需修改Presenter层代码。这也就解决了Activity作为View层难免会有业务逻辑以及Presenter层很难被复用的问题(如果View发生变化,Presenter层可能也会变化)。

2、TheMvp原理

上面已经说了TheMvp是把Activity作为Presenter层,里面包含一个ViewDeletegate代理类来间接操作View层对外提供的方法。原理图如下:


TheMvp.png

3、TheMVP代码说明

要将Activity作为Presenter来写,需要让View变得可复用,必须解决的一个问题就是setContentView()如何调用,因为它是Activity(Fragment有类似)的方法。
我们需要把视图抽离出来独立实现。可以定义一个接口,来限定View层必须实现的方法(这个接口定义,也就是View层的代理对象),例如:

public interface IDelegate {
    void create(LayoutInflater i, ViewGroup v, Bundle b);
    View getRootView();
}

首先通过inflater一个布局,将这个布局转换成View,再用getRootView()方法把这个View返回给Presenter层,让setContentView(view)去调用,这样就实现了rootView的独立。
所以,在Presenter层,我们的实现应该是:

protected void onCreate(Bundle savedInstanceState) {
    //获取到视图层对象
    IDelegate viewDelegate = xxx;
    //让视图层初始化(如果是Fragment,就需要传递onCreateView方法中的三个参数)
    viewDelegate.create(getLayoutInflater(), null, savedInstanceState);
    //拿到初始化以后的rootview,并设置content
    setContentView(viewDelegate.getRootView());
}
上一篇 下一篇

猜你喜欢

热点阅读