最适合使用RxJava处理的四种场景

新闻 移动开发
RxJava是非常热门的函数响应式编程库,在Android开发中已经非常流行了,刚开始上手会有点难,但只要理解了它,就再也回不去了。

RxJava是非常热门的函数响应式编程库,在Android开发中已经非常流行了,刚开始上手会有点难,但只要理解了它,就再也回不去了;不使用RxJava写异步请求的话,就感觉各种不爽。

[[201947]]

本文不准备讲RxJava的基础知识,如果你对RxJava不熟悉,这里有篇不错的教程可以参考 《给 Android 开发者的 RxJava 详解》 。

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

场景一: 单请求异步处理

由于在Android UI线程中不能做一些耗时操作,比如网络请求,大文件保存等,所以在开发中经常会碰到异步处理的情况,我们最典型的使用场景是RxJava+Retrofit处理网络请求

MyService myService = retrofit.create(MyService.class);
myService.getSomething()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateUI, this::showError);

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

public void updateUI(Data data){
      //TODO something
}

public void showError(throwable t){
      //show error msg
}

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

这种场景其实也很常见,我们做用户头像编辑的使用,一般就会有三个请求需要连续调用:

  1. 请求头像上传的地址
  2. 上传头像
  3. 更新用户信息

在平时的代码里,我们需要一步步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<Notification> combiNotification(List<Notification> n1, List<Notification> n2){
      //TODO 合并通知列表
}

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<Long>() {
                    @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();
责任编辑:张燕妮 来源: 推酷
相关推荐

2020-11-24 05:59:41

容器

2020-03-17 15:55:12

Redis数据库命令

2018-09-25 07:08:52

IAM身份及访问管理网络安全

2009-01-19 16:54:50

数据挖掘CRM孤立点

2018-09-07 06:30:50

物联网平台物联网IOT

2021-02-14 10:09:04

数据目录数据元数据

2017-04-07 11:30:04

人工智能开发编程语言

2009-07-16 10:53:11

iBATIS 使用

2016-01-26 09:58:28

云存储云服务云安全

2018-01-05 08:53:32

LinuxUbuntu发行版

2019-03-10 22:21:47

框架AI开发

2020-12-31 11:42:23

Linux编程字体代码

2017-03-09 13:30:13

Linux游戏AMD

2012-03-20 09:32:24

Linux服务器

2020-11-10 10:08:41

Kubernetes容器开发

2016-07-14 16:27:54

linux

2012-12-13 21:50:43

2014-08-19 15:05:08

Linux

2018-07-16 08:50:31

固态硬盘内存

2011-08-01 09:57:14

Linux发行版
点赞
收藏

51CTO技术栈公众号