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

作者: 阳春面 | 来源:发表于2017-09-01 01:15 被阅读361次

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

rxjava
本文不准备讲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表达式,updateUIshowError需要在当前类中实现,比如:

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

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

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

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

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

在平时的代码里,我们需要一步步callback嵌套下来,代码冗长太难看,而且不好维护,使用RxJava链式调用处理代码逻辑就会非常清晰

MyService myService = retrofit.create(MyService.class);
myService.getUploadUrl()
        .flatMap(this::uploadImageTask)
        .flatMap(this::updateUserInfo)
            .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();

本文作者: 阳春面
本文链接: http://appkfz.com/2017/09/01/best-scene-use-rxjava/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!


扫一扫下方二维码,关注我的微信公众号(APP开发进阶),第一时间获得Android开发进阶文章

APP开发进阶

相关文章

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

    RxJava是非常热门的函数响应式编程库,在Android开发中已经非常流行了,刚开始上手会有点难,但只要理解了它...

  • RxJava使用场景

    RxJava使用场景

  • 主流消息队列对比和应用场景

    消息队列的使用场景 消息队列做为中间件在大型系统中使用非常广泛,典型的使用场景有四种:异步处理,应用解耦,流量削锋...

  • rxjava的disposable

    rxjava+retrofit处理网络请求 在使用rxjava+retrofit处理网络请求的时候,一般会采用对观...

  • Android Rxjava3 使用场景

    一、Rxjava使用场景 为了模拟实际场景,从wanandroid网站[https://www.wanandroi...

  • RxJava使用场景

    1.线程切换 subscribeOn() observeOn() subscribeOn()和observeOn(...

  • RxJava使用场景

    一、Scheduler线程切换这种场景经常会在“后台线程取数据,主线程展示”的模式中看见 二、使用debounce...

  • RxJava使用场景

    本笔记摘自云在千锋RxJava系列教程.何时应该使用RxJava?Rx Java适合组合和消耗一系列的事件(数据)...

  • Rxjava使用场景

    前言 开始接触并且尝试的去应用Rxjava是从抛物线的这篇文章给 Android 开发者的 RxJava 详解开始...

  • Rxjava 使用场景

    Single:大多数场景都是单值发射,所以使用 Single 即可覆盖大部分场景。https://blog.csd...

网友评论

本文标题:最适合使用RxJava处理的四种场景

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