RxJava+Retrofit+OkHttp深入浅出-mvp(使用篇)

来源:互联网 发布:linux系统改编码 编辑:程序博客网 时间:2024/06/04 20:45

RxJava+Retrofit+OkHttp深入浅出-mvp(使用篇)

背景

RxJava+Retrofit+OkHttp封装系列也基本完成了,功能无太大迭代的需要,但是最近QQ群中有兄弟问如何结合mvp使用这套框架,仔细考虑下确实现在结合mvp开发项目已经是一种大趋势,不得不感叹现在技术更新的真是太快了,所以决定再一次操刀讲解下结合mvp使用需要注意的细节。

思路

既然是结合mvp,那就必须先了解mvp是很方圣神了,之前也出过相关的博文,就不啰嗦了。在了解了mvp的特效后,之前的封装大致需要做出以下修改:

  • 剔除加载框统一处理,采用接口view层中手动显示调用

  • 简化ProgressSubscriber功能,去掉无用的content依赖,降低耦合

  • 将网络处理加入mvp框架的model层处理

思路完成了,重度使用患者估计已经完全明白了。开始我们的使用

mvp简单使用

先简单的来一个例子,帮对mvp不懂的同学复习下。

view接口

定义view层回调接口

public interface Vlistener {    void onTestNext(String msg);}

presenter接口

定义两个接口,一个用户view层,一个用于model,确保Model层不直接操作View层;

p层提供给v层的接口

/** * p层提供给v层的接口 * Created by WZG on 2016/12/26. */public interface Plistener {    /**     * 其他方法-演示     * @param msg     */    void doTest(String msg);}

mvpp层提供给m层使用的接口

/** * mvp 中p层提供给m层使用的接口 * Created by WZG on 2016/12/26. */public interface PVlistener {    /**     * 测试回调     * @param msg     */    void testPSuc(String msg);}

m层提供给p层的接口

/** * m层提供给p层的接口 * Created by WZG on 2016/12/26. */public interface Mlistener {    /**     * 测试接口     * @param s     */    void testDo(String s);}

view层事件调用

view 层拥有一个presenter层的引用,触发事件后调用presenter层接口处理。

  private Plistener plistener;@OnClick(value = R.id.tv_test)    void onTvTestClick(View view) {        plistener.doTest("1");    }

presenter层调用model层接口初始数据

public class P implements Plistener,PVlistener{    private Vlistener vlistener;    private Mlistener mlistener;    public P(Vlistener viewListener) {        this.vlistener = viewListener;        mlistener =new M(this);    }    @Override    public void doTest(String msg) {        mlistener.testDo(msg);    }    @Override    public void testPSuc(String msg) {        vlistener.onTestNext(msg);    }

model层处理数据,回调给presenterpresenter回调给view

public class M implements Mlistener{    private PVlistener pVlistener;    public M(PVlistener pVlistener) {        this.pVlistener = pVlistener;    }    @Override    public void testDo(String s) {        String msg = "M" + s;        pVlistener.testPSuc(msg);    }}

presenter层传递给view

  @Override    public void testPSuc(String msg) {        vlistener.onTestNext(msg);    }

通过以上的伪代码,大致了解了mvp调用的执行过程,所以结合RxRetrofit使用只需要各层添加对应的接口,在model层中触发http请求即可;

结合RxRetorift 使用

view层添加接口

public interface Vlistener {    void onTestNext(String msg);    void showProg();    void dismissProg();    void onNext(String s,String m);    void  onError(ApiException e);}

view回调实现

首先封装一个简单的BaseActivity处理公用的加载框显示和隐藏处理

public class BaseActivity extends RxAppCompatActivity {    //    加载框可自己定义    protected ProgressDialog pd;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if(pd==null){            pd = new ProgressDialog(this);            pd.setCancelable(false);        }    }    protected void showP(){        if(pd!=null&&!pd.isShowing()){            pd.show();        }    }    protected void dismissP(){        if(pd!=null&&pd.isShowing()){            pd.dismiss();        }    }}

view层回调界面显示处理

public class MvpActivity extends BaseActivity implements Vlistener {    @BindView(R.id.tv_test)    TextView tvTest;    @BindView(R.id.tv_msg)    TextView tvMsg;    private Plistener plistener;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_mvp);        ButterKnife.bind(this);        plistener = new P(this);    }    @OnClick(value = R.id.tv_test)    void onTvTestClick(View view) {        plistener.doTest("1");    }    @OnClick(value = R.id.tv_msg)    void onTvMsgClick(View view) {        SubjectPostApi postEntity = new SubjectPostApi();        postEntity.setAll(true);        plistener.startPost(MvpActivity.this, postEntity);    }    @Override    public void showProg() {        showP();    }    @Override    public void dismissProg() {        dismissP();    }    @Override    public void onNext(String s, String m) {        tvMsg.setText("返回数据:" + s);    }    @Override    public void onError(ApiException e) {        tvMsg.setText("错误信息:" + e.getMessage() + "------" + e.getCode());    }    @Override    public void onTestNext(String msg) {        tvTest.setText("测试返回数据了:" + msg);    }}

presenter添加接口

事件触发接口

/** * p层提供给v层的接口 * Created by WZG on 2016/12/26. */public interface Plistener {    /**     * http请求     * @param rxAppCompatActivity     * @param baseApi     */    void startPost(RxAppCompatActivity rxAppCompatActivity, BaseApi baseApi);    /**     * 其他方法-演示     * @param msg     */    void doTest(String msg);}

view回调接口

/** * mvp 中p层提供给m层使用的接口 * Created by WZG on 2016/12/26. */public interface PVlistener {    /**     * 测试回调     * @param msg     */    void testPSuc(String msg);    /**     * 成功后回调方法     *     * @param resulte     * @param mothead     */    void onNext(String resulte, String mothead);    /**     * 失败     * 失败或者错误方法     * 自定义异常处理     *     * @param e     */    void onError(ApiException e);}

presenter实现

当触发以后,完全交给model层处理,当结果返回时,传递给view即可

/** * presenter两个接口,一个请求一个回调 * 目的:确保Model层不直接操作View层 * Created by WZG on 2016/12/26. */public class P implements Plistener,PVlistener{    private Vlistener vlistener;    private Mlistener mlistener;    public P(Vlistener viewListener) {        this.vlistener = viewListener;        mlistener =new M(this);    }    @Override    public void startPost(RxAppCompatActivity rxAppCompatActivity, BaseApi baseApi) {        vlistener.showProg();        mlistener.startPost(rxAppCompatActivity,baseApi);    }    @Override    public void doTest(String msg) {        mlistener.testDo(msg);    }    @Override    public void testPSuc(String msg) {        vlistener.onTestNext(msg);    }    @Override    public void onNext(String resulte, String mothead) {        vlistener.onNext(resulte,mothead);        vlistener.dismissProg();    }    @Override    public void onError(ApiException e) {        vlistener.onError(e);        vlistener.dismissProg();    }}

model层接口

/** * m层提供给p层的接口 * Created by WZG on 2016/12/26. */public interface Mlistener {    /**     * 开始任务     * @param rxAppCompatActivity     * @param baseApi     */    void startPost(RxAppCompatActivity rxAppCompatActivity, BaseApi baseApi);    /**     * 测试接口     * @param s     */    void testDo(String s);}

model层实现

model层中出了实现自定义的接口外,还需要实现Retrofit回调接口的处理,在服务器返回数据后及时处理,回调给presenter层的PVlistener

/** * m层数据处理 * Created by WZG on 2016/12/26. */public class M implements Mlistener, HttpOnNextListener {    private PVlistener pVlistener;    public M(PVlistener pVlistener) {        this.pVlistener = pVlistener;    }    @Override    public void startPost(RxAppCompatActivity rxAppCompatActivity, BaseApi baseApi) {        HttpManager manager = new HttpManager(this, rxAppCompatActivity);        manager.doHttpDeal(baseApi);    }    @Override    public void testDo(String s) {        String msg = "M" + s;        pVlistener.testPSuc(msg);    }    @Override    public void onNext(String resulte, String mothead) {        pVlistener.onNext(resulte, mothead);    }    @Override    public void onError(ApiException e) {        pVlistener.onError(e);    }}

到这里一套适用于mvp+RxRetrofit的框架就运用而生了,当然你可以继续添加功能,这里只是简单的给出使用的思路。

实现效果

这里写图片描述


终极封装专栏

RxJava+Retrofit+OkHttp深入浅出-终极封装专栏)


源码

传送门-下载封装源码


建议

如果你对这套封装有任何的问题和建议欢迎加入QQ群告诉我!

3 0
原创粉丝点击