本文不准备讲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表达式,updateUI
和showError
需要在当前类中实现,比如:
public void updateUI(Data data){ //TODO something}public void showError(throwable t){ //show error msg}复制代码
场景二: 多异步请求连续调用
这种场景其实也很常见,我们做用户头像编辑的使用,一般就会有三个请求需要连续调用:
- 请求头像上传的地址
- 上传头像
- 更新用户信息
在平时的代码里,我们需要一步步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 ListcombiNotification(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开发进阶文章