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<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();
【编辑推荐】
- 外媒速递:实现WIndows 10 PC与Android顺畅协作的七种方法
- 外媒速递:6个最常见的Android问题解决筹划
- 谷歌嫌Android开源问题太多,计算开辟第二个iOS
- 即将到来的I/0大年夜会,Android将解决安卓碎片化
- 外媒速递:iOS 11仍未能成功惹人的六项Android功能
MyService myService = retrofit.create(MyService.class);myService.getSomething() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::updateUI, this::showError);
推荐阅读
8月31日消息 距离Android Oreo正式版宣布还不抵站周,甚至谷歌旗下Pixel手机也于近日才收到OTA更新。可是,谷歌似乎迫在眉睫地想要开辟下一代安卓体系Android P了。日前,XDA开辟者Mishaa>>>详细阅读
本文标题:最适合使用RxJava处理的四种场景
地址:http://www.17bianji.com/lsqh/37098.html
1/2 1