作家
登录

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

作者: 来源: 2017-09-01 13:18:25 阅读 我要评论

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}

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

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

  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 归并通知列表}

为了使代码看起来简洁点,这边还应用了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<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();

【编辑推荐】

  1. 外媒速递:实现WIndows 10 PC与Android顺畅协作的七种方法
  2. 外媒速递:6个最常见的Android问题解决筹划
  3. 谷歌嫌Android开源问题太多,计算开辟第二个iOS
  4. 即将到来的I/0大年夜会,Android将解决安卓碎片化
  5. 外媒速递:iOS 11仍未能成功惹人的六项Android功能
【义务编辑:张燕妮 TEL:(010)68476606】
MyService myService = retrofit.create(MyService.class);myService.getSomething()            .subscribeOn(Schedulers.io())            .observeOn(AndroidSchedulers.mainThread())            .subscribe(this::updateUI, this::showError);


  推荐阅读

  奥利奥才发,谷歌已经着手开发Android P

8月31日消息 距离Android Oreo正式版宣布还不抵站周,甚至谷歌旗下Pixel手机也于近日才收到OTA更新。可是,谷歌似乎迫在眉睫地想要开辟下一代安卓体系Android P了。日前,XDA开辟者Mishaa>>>详细阅读


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

地址:http://www.17bianji.com/lsqh/37098.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)