MVP架构封装

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();
            }
        }
        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){

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值