博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最适合使用RxJava处理的四种场景
阅读量:6620 次
发布时间:2019-06-25

本文共 3046 字,大约阅读时间需要 10 分钟。

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

本文不准备讲RxJava的基础知识,如果你对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);复制代码

先获取请求,再上传头像,最后更新用户信息,后面的任务依赖上一步的处理结果,依次执行。

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

有时候在项目中,我们会碰到组合多个请求的结果后,再更新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 合并通知列表}复制代码

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();复制代码

本文作者: 阳春面

本文链接:
版权声明: 本博客所有文章除特别声明外,均采用 许可协议。转载请注明出处!


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

APP开发进阶

转载于:https://juejin.im/post/59a83f146fb9a0248f4a9aa2

你可能感兴趣的文章
从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(一)
查看>>
Windows 10之 隐藏“此电脑”窗口的6个额外文件夹
查看>>
15.1异常处理
查看>>
HAProxy负载均衡web服务
查看>>
初学者学习Linux之NFS
查看>>
Rabbitmq学习(一) Rabbitmq初探
查看>>
8月第一周B2B类网站排名:阿里巴巴持续领先
查看>>
IDC评述网:12月下旬国内域名注册商净增量Top10
查看>>
5月第一周全球域名解析商Top15:万网升至第7名
查看>>
架构优化 - 应用,MQ Broker,业务处理分层
查看>>
3月第3周网络安全报告:被篡改.COM网站占74.3%
查看>>
Spring Security之用户名+密码登录
查看>>
java JSplitPane设置比例
查看>>
批量操作Windows域用户
查看>>
shell脚本 接受用户参数 记录一下
查看>>
健脾祛湿的中成药有哪些?
查看>>
IIS下支持下载.exe文件
查看>>
CXF WebService Hello World
查看>>
市场调研报告:企业级信息防泄漏大趋势
查看>>
济南企业短信平台的价格如何?
查看>>