此项目源码参考:
设计模式讲解参考:
MVC、MVP、MVVM三种区别_Tiger的专栏-CSDN博客
MVP是Google开源的一个设计模式,主要是为了细分视图(View)与模型(Model)的功能,让View只做两件事:
- 完成用户的交互;
- 显示界面布局,同时让Model做数据的处理,业务逻辑放到另外的一个类(Presenter)中。
下面做具体分析:
- M:M层,在项目中负责数据的处理,包括本地数据库查询,网络数据获取都在这一层中完成;
- View:V层,在项目中是UI模块,也就是各种activity/fragment,负责绘制UI元素、与用户进行交互。
- P:P层,在项目做为View与Model的桥梁,M跟V层不直接交互,M层在获取到数据之后,传递到P,P层再通过接口回调到View层,同样,View层的点击等事件,通过P层去通知M层去处理。
如下图所示:
1.MVP设计模式实践
1.1MVP基类定义
MVP设计模式下P将M和V完全隔离开,P和V是双向通信,P和M之间也是双向通信,采用面向接口编程,Fragment/Activity属于V层,Fragment/Activity会实现V接口,P通过持有的V实现通知Fragment/Activity需要进行UI更新,P间接间接持有Fragment/Activity,可能会造成内存泄露,那么如何解决呢,接下来讲解一下项目中的实践?
定义Presenter接口
我们在定义Presenter时会定义attachView()和detachView方法,然后在Activity/Fragment下onCreate()方法调用Presenter.attachView()关联持有的V(Activity/Fragment),在onDestroy()方法下调用Presenter.detachView()取消关联持有的V(Activity/Fragment),从而解决内存泄漏问题;
public interface MvpPresenter<V extends MvpView> {
@UiThread
void attachView(V view);
@UiThread
void detachView(boolean retainInstance);
}
Presenter接口实现
Presenter持有V的弱引用
public class MvpBasePresenter<V extends MvpView> implements MvpPresenter<V>{
private WeakReference<V> viewRef;
public void MvpBasePresenter(){
}
@UiThread
public void attachView(V view) {
this.viewRef = new WeakReference(view);
}
@UiThread
public V getView(){
return this.viewRef == null ? null : (V)this.viewRef.get();
}
@UiThread
public void detachView(boolean retainInstance) {
if(this.viewRef.get() != null){
this.viewRef.clear();
this.viewRef = null;
}
}
}
定义Activity基类
添加和移除Presenter对V的引用
public abstract class BaseMvpActiv