其实说起MVP设计模式,应该要先去了解一下mvc设计模式,android本身就是一种MVC的设计模式:网络,数据库,本地文件的数据存取作为Model,Acitivity作为Controller,而xml文件还有一些界面相关的组件作为View。但是这样的设计在我们真正去做项目的时候可能完美的体现出来么?这是不可能的,往往我们要在Activity里面写很多界面的东西,比如Dialog,PopWindow等等,也就是说,View层和Controller层紧紧联系在一起,造成代码的高度耦合。而且在MVC里,是允许View层直接访问Model层的。而mvp的出现就是用Presenter代替以前的Controller,实现V,C层的完美分离,当然这个实现需要接口的辅助。看完下面的例子就明白了。
1、model层处理
定义两个类 MvpModel,BaseModel对网络数据请求进行封装
public abstract class MvpModel {
private Context mContext;
public MvpModel(Context mContext) {
this.mContext = mContext;
}
public String getServerUrl() {
return Contans.HTTP_URL;
}
}
public class BaseModel extends MvpModel {
public BaseModel(Context mContext) {
super(mContext);
}
public Retrofit initRetrofit() {
return new Retrofit.Builder()
.baseUrl(getServerUrl())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create()).build();
}
}
2、view定义接口
public interface MvpView {
void sucess(String result);
//显示登录失败,并说明服务器登录错误的原因
void showLoginFail(Throwable t);
}
MvpView这个具体根据你的项目而定,看看界面需要定义的共同方法是什么,可以加到父接口中,一般用空接口就行了
3、定义MvpPresenter 简称p层,p的作用就是与view,model两者之间建立联系,作为一个桥梁 的关系
下面定义了几个类MvpBasePresenter,BasePresenter,和两个接口 OnFinishedListener,MvpPresenter
MvpPresenter 的作用是对view进行绑定,
public interface MvpPresenter<V extends MvpView> {
void attchView(V view);
void disattchView(boolean retainInstance);
}
MvpBasePresenter是实现MvpPresenter 接口的一个类,对view操作的方法进行实现。
public abstract class MvpBasePresenter<V extends MvpView> implements MvpPresenter<V> {
private WeakReference<V> viewRef;
@Override
public void attchView(V view) {
viewRef = new WeakReference<>(view);
}
@Override
public void disattchView(boolean retainInstance) {
if (viewRef != null) {
viewRef.clear();
viewRef = null;
}
}
public boolean isViewAttached() {
return viewRef != null && viewRef.get() != null;
}
public V getView() {
return viewRef == null ? null : viewRef.get();
}
}
BasePresenter抽象类,与model建立关系,并集成MvpBasePresenter从而也与view建立联系
public abstract class BasePresenter<M extends BaseModel> extends MvpBasePresenter {
private M model;
private Context mContext;
public BasePresenter(Context mContext) {
this.mContext = mContext;
model = bindModel();
}
public Context getContext() {
return mContext;
}
public M getModel() {
return model;
}
public abstract M bindModel();
}
OnFinishedListener是将p层获取数据的成功或者失败返回给view层(回调)
public interface OnFinishedListener {
//加载成功
void onSuccess(String result);
//加载失败
void Fialed(Throwable t);
}