通用 Mvp网络框架

Retrofit+RxJava+okHttp 抽象搭建Mvp

MVP

mvp是在mvc的基础上进行演化而来,它分离了view层和model层,中间通过presenter来进行通信,也就是说各层做各层的事情,互不干扰,最后通过中间人去传递,这样就大大的提高的代码的可读性以及维护性,但相对而言,就需要写很多的类和方法,所以说,如果项目不大,并且迭代不多的情况下,可以考虑用mvc,反之就mvp吧,当然也可以用mvvm,clean,下面开始正文

首先,通过网上查找的一些博客,我发现封装的大部分是泛型,也就是说当你传入你需要的类型,在P层传回固定的数据,V层传回的数据也就定死了,这就导致我们需要写多个P层 对于我现在所做的项目来说,有一些不必要

根据这一种封装,一个页面只能请求一个接口 ,当请求两个不一样的接口时,就有一点点小尴尬,当然,你也可以将V层的方法里的参数写成Object 类型 但是,这并没有改变你需要写多个P层 可以说是一个页面一个P层 这和我想象中的有些不太一样

在思考的过程中,我发现了java重载机制,可以运用到我的Mvp中

我的这种方法之是用于接口较少,参数类型少

好了,废话不多说 代码如下

请求接口 可以发现利用了重载,P层和M层也会用到重载

public interface MyUrlService {

    @POST
    Observable postRequest(@Url String url, @QueryMap Map map);

    @Multipart
    @POST
    Observable postRequest(@Url String url,@Part MultipartBody.Part file);

    @GET
    Observable getRequest(@Url String url, @QueryMap Map map);

    @GET
    Observable getRequest(@Url String url);

}

根据请求方式来划分,将可能用到的参数都写进去

public interface Contract  {

    public interface IView{
        public void setData(Object data);
    }

    public interface IModel{
        //get请求方式
        public void getHttp(String url, Map map,int flag, RetrofitHttpUtil.RetrofitBack back);
        //post请求方式
        public void postHttp(String url, Map map,MultipartBody.Part part,int flag, RetrofitHttpUtil.RetrofitBack back);

    }

    public interface IPresenter{

        public void onAttch(IView iView);
        //get请求
        public void getHttp(String url, Map map,int flag,Class mclass);
        //post请求
        public void postHttp(String url, Map map, MultipartBody.Part part, int flag, Class mclass);

        public void unAttch();

    }

}

这里你会发现,我们在P层传了一个Class 类型参数 也就是你要解析的Bean类的class ,这样,一个请求方式就可以请求你所相对应的方式的所有接口

P层的父类

public abstract class BasePrsenter implements Contract.IPresenter {

    private Contract.IView iView;
    private BaseModel iModel;

    public abstract void getMethod(String url,Class mclass);
    public abstract void getMethod(String url, Map map,Class mclass);

    public abstract void postMethod(String url, Map map,Class mclass);
    public abstract void postMethod(String url, MultipartBody.Part part, Class mclass);

    @Override
    public void onAttch(Contract.IView iView) {
        this.iView=iView;
        iModel=new ModelImpl();
    }

    @Override
    public void getHttp(String url, Map map, int flag, final Class mclass) {

        RetrofitHttpUtil.RetrofitBack retrofitBack = new RetrofitHttpUtil.RetrofitBack() {
            @Override
            public void success(String success) {
                Gson gson=new Gson();
                Object o = gson.fromJson(success, mclass);
                iView.setData(o);
            }

            @Override
            public void error(String error) {
                Log.e("tag",error);
            }
        };

        switch (flag) {
            case 1:
                iModel.getMethod(url,retrofitBack);
                break;
            case 2:
                iModel.getMethod(url,map,retrofitBack);
                break;
        }


    }

    @Override
    public void postHttp(String url, Map map, MultipartBody.Part part, int flag, final   Class mclass) {
        RetrofitHttpUtil.RetrofitBack retrofitBack = new RetrofitHttpUtil.RetrofitBack() {
            @Override
            public void success(String success) {
                Gson gson=new Gson();
                Object o = gson.fromJson(success, mclass);
                iView.setData(o);
            }

            @Override
            public void error(String error) {
                Log.e("tag",error);
            }
        };

        switch (flag) {
            case 1:
                iModel.postMethod(url,map,retrofitBack);
                break;
            case 2:
                iModel.postMethod(url,part,retrofitBack);
                break;
        }
    }

    @Override
    public void unAttch() {
        iView=null;
        iModel=null;
    }
}

P层的子类

public class PrsenterImpl extends BasePrsenter {

    @Override
    public void getMethod(String url, Class mclass) {
        getHttp(url,null,1,mclass);
    }

    @Override
    public void getMethod(String url, Map map, Class mclass) {
        getHttp(url,map,2,mclass);
    }

    @Override
    public void postMethod(String url, Map map, Class mclass) {
        postHttp(url,map,null,1,mclass);
    }

    @Override
    public void postMethod(String url, MultipartBody.Part part, Class mclass) {
        postHttp(url,null,part,2,mclass);
    }


}

这里我认为我充分了利用了我所认识的重载,在V层调用P层时,你只需要传你所需要的参数,父类会调用你所传的参数来做出相应的改变

M的父类

public abstract class BaseModel implements Contract.IModel {

    private RetrofitHttpUtil util;

    public abstract void getMethod(String url, RetrofitHttpUtil.RetrofitBack back);
    public abstract void getMethod(String url, Map map, RetrofitHttpUtil.RetrofitBack back);

    public abstract void postMethod(String url, Map map, RetrofitHttpUtil.RetrofitBack back);
    public abstract void postMethod(String url,MultipartBody.Part part, RetrofitHttpUtil.RetrofitBack back);

    @Override
    public void getHttp(String url, Map map,int flag, RetrofitHttpUtil.RetrofitBack back) {
        getRxHttp();
        util.getHttpInfo(url,map,flag,back);
    }

    @Override
    public void postHttp(String url, Map map, MultipartBody.Part part, int flag, RetrofitHttpUtil.RetrofitBack back) {
        getRxHttp();
        util.postHttpInfo(url,map,part,flag,back);
    }


    private void getRxHttp() {
        if (util==null){
            util=RetrofitHttpUtil.getInstance();
        }
    }

}

M的子类

public class ModelImpl extends BaseModel {

    @Override
    public void getMethod(String url, RetrofitHttpUtil.RetrofitBack back) {
        getHttp(url,null,1,back);
    }

    @Override
    public void getMethod(String url, Map map, RetrofitHttpUtil.RetrofitBack back) {
        getHttp(url,map,2,back);
    }


    @Override
    public void postMethod(String url, Map map, RetrofitHttpUtil.RetrofitBack back) {
        postHttp(url,map,null,1,back);
    }

    @Override
    public void postMethod(String url, MultipartBody.Part part, RetrofitHttpUtil.RetrofitBack back) {
        postHttp(url,null,part,2,back);
    }

}

接下里工具类

    public void postHttpInfo(String url, Map map, MultipartBody.Part file, int flag, final RetrofitBack callback) {

        Observable request = null;

        switch (flag) {
            case 1:
                request = rx.postRequest(url, map);
                break;
            case 2:
                request = rx.postRequest(url, file);
                break;
        }


        request .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        callback.error(e.getMessage());
                    }

                    @Override
                    public void onNext(ResponseBody responseBody) {
                        try {
                            callback.success(responseBody.string());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
    }
public void getHttpInfo(String url, Map map, int flag, final RetrofitBack callback) {

        Observable request = null;

        switch (flag) {
            case 1:
                request = rx.getRequest(url);
                break;
            case 2:
                request = rx.getRequest(url,map);
                break;
        }

        request.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        callback.error(e.getMessage());
                    }

                    @Override
                    public void onNext(ResponseBody responseBody) {

                        try {
                            callback.success(responseBody.string());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });


    }

Activity的父类

public abstract class BaseActivity extends AppCompatActivity implements Contract.IView {


    public BasePrsenter prsenter;

    public abstract int initLayout();
    public abstract void  initView();
    public abstract void  initData();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(initLayout());
        ButterKnife.bind(this);
        prsenter = new PrsenterImpl();
        prsenter.onAttch(this);
        initView();
        initData();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        prsenter.unAttch();
    }
}

我们只需要实现P层的子类,在Activity中调用方法即可

当一个新接口参数发生改变时,只需要像契约类中添加参数 在P层和M层的父类中改变实体方法,添加抽象方法就ok啦

这是是一个小白的思路,如果有不足之处请大家指出。

最后附上一段话

有志者,事竟成,破釜沉舟,百二秦关终属楚。
苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

你可能感兴趣的:(android,框架搭建)