您的位置:首页 > 运维架构 > 网站架构

MVP架构封装

2018-01-31 12:39 162 查看

Android MVP框架设计

MVP结构:

M层

数据层,数据可以是从远程服务器获取,也可以是从本地数据库获取.一般android应用中数据原大都为
远程服务器,所以M层的工作可以暂且看成就是网络请求部分.  m层具体体现应该为网络请求相关代码


V层

数据展示层,将M层获取到的数据展示到前台告诉用户结果,具体体现为activity或者fragment等前台页面以及一些弹窗,TOAST提示等交互


P层

Presenter层,属于一个中间层,负责M层和V层之间的一个交互,也是mvp比较重要的一环,实现了M层和V
层的解耦


初步思路

由上面的一个关系图可以看出来M层和V层交互都在P层中,所以P层对M层或者V层应该是一个依赖组合的关
系,P层持有M层,V层对象或者以参数形式调用,代码实现:

public class Presenter {
private M m;
private V v;

public Presenter(M m, V v){
this.m = m;
this.v = v;
}

public void login(String[] params){
m.login(params, new Callback(){
@Override
public void onResponse(String result){
v.loginSuccess(result);
}

@Override
public void onError(Exception e){
v.loginFailed(e);
}
});
}
}

public class M{
public void login(String[] params){
//此处为网络请求代码(OKHttp,Retrofit),省略...
}
}

public interface V{
void loginSuccess(String result);

void loginFailed(Exception e);
}

然后在Activity或者fragment初始化presenter(activity自身实现view接口),在需要请求接口的地方
调用p.login();


进一步封装

思考:M层和View层交互在Presenter中,Presenter初始化在activity或者fragment中.是否可以
将presenter初始化放在BaseFragment或者BaseActivity中,在onCreate时候已经初始化.

问题已经提出来了,如何在一个类中将三个类关联起来,V<P, M>这种结构应该是可以的,通过泛型将三个类关
联起来,然后再获取泛型类型再通过Class.newInstance()初始化泛型对象.前提是泛型类型都有一个无参构
造方法, 获取泛型类型代码如下:

public class TypeUtil {
public static <T> T getType(int index, Object obj){
if (obj == null){
throw new NullPointerException("获取泛型的对象不能为空");
}
Type superclass = obj.getClass().getGenericSuperclass();
if (superclass instanceof ParameterizedType){
Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();
Type targetType = types[index];
try {
return ((Class<T>) targetType).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassCastException e){
e.printStackTrace()
4000
;
}
}
return null;
}

public static Type getClassType(int index, Object obj){
if (obj == null){
throw new NullPointerException("获取泛型的对象不能为空");
}
Type superclass = obj.getClass().getGenericSuperclass();
if (superclass instanceof ParameterizedType) {
Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();
return types[index];
}
return null;
}
}

obj.getClass().getGenericSuperclass()为获取父类的type类,如果父类是带有泛型的,那么就是type
就是ParameterizedType型的,然后强转并且调用getActualTypeArguments方法获取泛型数组

然后是BaseActivity代码,这里名字使用MVPActivity:

public class MvpActivity<P extends BasePresenter, M> extends AppCompatActivity {

protected P mPresenter;
protected M mModel;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
mPresenter = getPresenterInstance();
mModel = getModelInstance();

if (mPresenter != null) {
mPresenter.setModel(mModel, this);
}
super.onCreate(savedInstanceState);

}

private P getPresenterInstance(){
return TypeUtil.getType(0, this);
}

private M getModelInstance(){
return TypeUtil.getType(1, this);
}

protected P getPresenter(){
return mPresenter;
}

protected M getModel(){
return mModel;
}
}

BasePresenter代码:

public class BasePresenter<M, V> {
private V mView;
private M mModel;

public void setModelView(M model, V v){
mModel = model;
mView = v;
}

public <V extends IView> V getView() {
return v;
}

public M getModel(){
return mModel;
}
}

使用方法:
public class TestActivity extends MVPActivity<LoginPresenter, Model> implements View{
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
getPresenter.login();
}

@Override
public void loginSuccess(String result){

}

@Override
public void loginSuccess(String result){

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: