RxJava+Retrofit+MVP开发介绍

作者: 乐小文 | 来源:发表于2017-03-18 18:01 被阅读0次

RxJava简介

给Android开发者RxJava详解
这算是介绍RxJava比较详细的文章了,阅读此文我相信你会有很大的收获的。
RxJava探索
这个专栏中介绍了RxJava中的几个主要类,值得一看,相信会帮助你对RxJava有更深的理解。

其实RxJava对于Android开发火了很久了,自从笔者使用后,发现RxJava火起来并不无道理,给笔者的第一印象就是方便!方便!方便!,重要的事情说三遍。
接下来我们就一起来结合代码看看RxJava给我们开发带来了哪些方便。

 App
                .initCookList(page, rows)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Func1<CookListBean, List<CookListBean.TngouBean>>() {
                    @Override
                    public List<CookListBean.TngouBean> call(CookListBean cookListBean) {
                        return cookListBean.getTngou();
                    }
                }).subscribe(new Action1<List<CookListBean.TngouBean>>() {
            @Override
            public void call(final List<CookListBean.TngouBean> list) {
                initListener(list);
            }
        });
  • subscribeOn(Schedulers.io()) 指定 subscribe() 所发生的线程,或者叫做事件产生的线程。
  • observeOn(AndroidSchedulers.mainThread()) 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
  • map操作符是过滤信息,返回一个你所需要的任意对象,并在后面的回调中进行操作。

这样的链式操作逻辑是不是很清楚?不需要我们去做一些线程的操作,RxJava中已经为我们做好了这一切。
以前我们后台请求数据,前台更新ui就会有很多问题。先需要在子线程中做一些IO操作,后在主线程中去更新ui。看似还比较简单,但如果我们需要在请求回来的数据中做一些判定及操作时,那么,代码就谜之缩进了。。。。

  • Func1和Action1两个接口很相似。
    1. 两者区别在于:Action1的Call方法无返回值,而Func1的Call方法是有返回值的
    1. 为了更好的解释两者,看看以下代码片段
Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("hello");
                subscriber.onNext("Leo");
                subscriber.onCompleted();
            }
        }).subscribe(new Action1<String>() {
           @Override
           public void call(String s) {
               Toast.makeText(RxJavaActivity.this, s, Toast.LENGTH_SHORT).show();
               Log.d(TAG, "call: "+s);
           }
       });      
  • 不难看出,Action1实际上可看做一个包装对象,将onNext()打包传入subscribe() 以实现不完整定义的回调。
  • Func1也可以看做一个包装对象,只是多了返回值,同样将打包的对象传入subscribe() 以实现不完整定义的回调。

RxJava的东西其实很多,这里只是简单的介绍了如何使用和一些基本概念,其实还有操作符,调度器等等,有兴趣了解的小盆友去看看文章开头所推荐的两篇文章。

Retrofit简介

Retrofit简介
Retrofit在上篇文章中已经简单的介绍了,后面会结合代码来具体的使用Retrofit。

MVP模式简介

  • 在了解MVP模式之前,我们先来看两张图:
MVC MVP
  • MVP模式是由MVC模式演变而来,其原因在于,MVC中的Controller耦合度太高,Android中的Activity即是Controller也是View,如果Activity中的业务逻辑复杂一点的话,Activity中的代码随随便便上千行,这是一件很可怕的事情,即使是你一个人写的代码。因为在你完成这个项目后的某一天,突然要改一个需求,你打开你的编译器时你会这样说:靠!这谁写的代码。分分钟会让你自己蒙圈,这点,笔者深有体会!说多了都是泪。

  • MVP模式有一个好处,就是解耦合。Activity和Fragment完全作为View层,所有的业务逻辑我们放在Presenter里,利用Presenter连接Model,处理完后回调给View层并更新UI。

  • 我们从代码层面来看看MVP具体的实现


public class MainActivity extends MvpActivity<CookListPresenter> implements CookListView {

    @BindView(R.id.btn)
    Button mBtn;
    @BindView(R.id.recycler)
    RecyclerView mRecycler;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initToolBarAsHome("MVP+Retrofit+RxJava");
    }

    @Override
    protected CookListPresenter createPresenter() {
        return new CookListPresenter(this);
    }

    @Override
    public void getDataSuccess(CookListModel model) {
        dataSuccess(model);
    }

    @Override
    public void getDataFail(String msg) {
        toastShow("网络不给力!");
    }

    @OnClick(R.id.btn)
    public void onClick() {
        showProgressDialog();
        mvpPresenter.loadDataByRetrofitRxjava(1,20);
    }

    //处理数据    
    private void dataSuccess(CookListModel model) {
        MyAdapter adapter = new MyAdapter(model.getTngou());
        mRecycler.setLayoutManager(new LinearLayoutManager(this));
        mRecycler.setAdapter(adapter);
    }
}

CookListPresenter

public class CookListPresenter extends BasePresenter<CookListView> {
    public CookListPresenter(CookListView view) {
        attachView(view);
    }
    public void loadDataByRetrofitRxjava(int page,int rows) {
        mvpView.showLoading();
        addSubscription(apiStores.getCookList(page,rows), new ApiCallback<CookListModel>(){

            @Override
            public void onSuccess(CookListModel model) {
                mvpView.getDataSuccess(model);
            }

            @Override
            public void onFailure(String msg) {
            mvpView.getDataFail(msg);
            }

            @Override
            public void onFinish() {
                mvpView.hideLoading();
            }
        } );
    }
}

不难看出,IO操作放在了Presenter里面,取回数据成功后,回调给View,然后更新UI。这样的模式是不是很清晰,view和presenter各司其职,大大降低了耦合。

好了,RxJava+Retrofit+MVP一些基本的东西就介绍完了,随后还是会上传一份demo到github上。
很难得周末一个人静下心写写文章,其实写完感觉还是蛮爽的。

demo已上传到github
RxJava_Retrofit_MVP_Demo

相关文章

  • RxJava+Retrofit+MVP开发介绍

    RxJava简介 给Android开发者RxJava详解这算是介绍RxJava比较详细的文章了,阅读此文我相信你会...

  • 个人app(ebay)

    安卓端,使用rxjava+retrofit+mvp为基本框架:java混合kotlin进行开发(大部分为kotli...

  • 安卓必读 - 收藏集 - 掘金

    Rxjava+Retrofit+MVP MD 风格 的阅读类 APP - Android - 掘金HiReader...

  • rxjava+retrofit+mvp

    有一段时间没有更新文章了,最近都在忙公司的项目偶尔闲下来也是针对之前的框架补一些七七八八的功能。包括一些第三方的以...

  • android 开发框架整合(Rxjava+Retrofit二次

    前言: 我们知道rxjava+retrofit+mvp已经出现很久了。由于最近项目需要大整改,故此封装一个比较适用...

  • 个人app(decompression)

    安卓端,使用rxjava+retrofit+mvp为基本框架: 功能: 1用户登录,修改信息 2发布图片动态,文字...

  • Rxjava2+Retrofit的完美封装

    要说2016年最火的Android技术是什么,毫无疑问肯定是RxJava+Retrofit+Mvp。现如今2017...

  • Rxjava+retrofit+mvp整合

    最近在看Rxjava,写了一个简单的 demo整合了Rxjava +retrofit+mvp,写完了迫不及待的分享...

  • RXJava+Retrofit+Mvp搭建

    导入依赖 定义一个解析的bean对象 定义一个接口类,用来设置网络请求方式Get/Post,请求接口,实体类,请求...

  • RXJava+Retrofit+MVP的简单封装

    RXJava+Retrofit+MVP的简单封装 马上就要过年了,躁动的心早已按耐不住,还是写上一篇文章来冷静下。...

网友评论

    本文标题:RxJava+Retrofit+MVP开发介绍

    本文链接:https://www.haomeiwen.com/subject/gsdunttx.html