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());
}
网友评论