RxJava是异常热点的函数响应式编程库,在Android开辟中已经异常风行了,刚开端上手会有点难,但只要懂得了它,就再也回不去了;不应用RxJava写异步请求的话,就感到各类不爽。

本文不预备讲RxJava的基本常识,如不雅你对RxJava不熟悉,这里有篇不错的教程可以参考 《给 Android 开辟者的 RxJava 详解》 。

下面我们开端介绍RxJava最合适应用的四种场景,代码示例基于RxJava1

场景一: 单请求异步处理

因为在Android UI线程中不克不及做一些耗时操作,比如收集请求,大年夜文件保存等,所以在开辟中经常会碰着异步处理的情况,我们最典范的应用处景是RxJava+Retrofit处理收集请求public void updateUI(Data data){ //TODO something}public void showError(throwable t){ //show error msg}

场景二: 多异步请求持续调用

这种场景其实也很常见,我们做用户头像编辑的应用,一般就会有三个请求须要持续调用:请求头像上传的地址

上传头像

更新用户信息

在日常平凡的代率攀里,我们须要一步步callback嵌套下来,代码冗长太难看,并且不好保护,应用RxJava链式调用处理代码逻辑就会异常清楚Observable.just(1) .map(this::task1) .map(this::task2) .map(this::task3) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::updateUI, this::showError);

这里的just发送的固定值1,没有实际意义,只是我认为如许更信息

你也可以用Observable.create创建observable。

场景三: 多异步请求归并处理

有时刻在项目中,我们会碰着组合多个请求的结不雅后,再更新UI的情况,比如我们项目中就有一个大年夜多个请求地址获取通知数据,然后在APP上再按时光次序组合后展示的需求,这时刻我们就可以用RxJava的zip函数来处理了MyService myService = retrofit.create(MyService.class);Observable o1 = myService.getNotification1();Observable o2 = myService.getNotification2();Observable.zip(o1,o2, this::combiNotification) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::updateUI, this::showError);public List combiNotification(List n1, List n2){ //TODO 归并通知列表}

为了使代码看起来简洁点,这边还应用了lambda表达式, updateUI 和 showError 须要在当前类中实现,比如:

zip函数会等待两个请求都完成后,调用我们的归并办法combiNotification,等归并处理后再回调subscribe中的办法。

场景四: 准时轮询

RxJava还特别合适对准时轮询义务的处理, 一种典范的例子就是APP提交了一个义务给后台异步处理,假设后台处理须要1-2分钟阁下,我们须要准时到后台萌芽进度,并更新到UI上, 传统的做法是用Handler的postDelay办法,用RxJava实现的话就会异常简洁Subscription subscription = Observable.interval(2, TimeUnit.SECONDS) .map(this::getProgress) .takeUntil(progress -> progress != 100) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber() { @Override public void onCompleted() { //TODO finished } @Override public void onError(Throwable e) { } @Override public void onNext(int progress) { //TODO update progress } });

我们以准时2秒萌芽一次,直到进度progress=100为止,主动终止轮询。

以上各类RxJava办法都是异步耗时调用,推敲到Activity的退出时请求还没有完成,我们须要在Activity的OnDestroy办法中撤消RxJava调用subscription.unsubscribe();