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 combiNotification(List n1, List 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() { @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();