RxJava+Retrofit+MVP开发介绍

96
乐小文
2017.03.18 18:01* 字数 1052

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

随笔
Web note ad 1