当前位置: 首页 > 科技观察

最适合RxJava处理的四种场景

时间:2023-03-19 00:25:53 科技观察

RxJava是一个非常流行的函数式响应式编程库,在Android开发中已经非常流行。刚开始上手会有点困难,但是一旦你明白了,你就再也回不去了;如果你不用RxJava写异步请求,你会觉得各种不爽。本文不打算讨论RxJava的基础知识。如果你不熟悉RxJava,这里有一个很好的教程供你参考《给 Android 开发者的 RxJava 详解》。下面我们开始介绍RxJava最适合使用的四种场景。代码示例基于RxJava1场景一:单请求异步处理由于一些耗时的操作不能在AndroidUI线程中进行,比如网络请求、大文件存储等,所以在开发中我们经常会遇到异步处理.我们最典型的使用场景是RxJava+Retrofit处理网络请求这::更新用户界面,这::显示错误);为了让代码看起来简洁,这里也使用了lambda表达式,updateUI和showError需要在当前类中实现,例如:publicvoidupdateUI(Datadata){//TODOsomething}publicvoidshowError(throwablet){//showerrormsg}场景二:多个异步请求连续调用。这种场景其实很常见。我们用它来编辑用户头像,一般会有三个请求需要连续调用:请求头像上传地址上传头像更新用户信息在平时的代码中,我们需要一步步嵌套回调.代码太长太丑,不易维护。使用RxJava链调用处理代码逻辑会很清晰Observable.just(1).map(this::task1).map(this::task2).map(this::task3).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(this::updateUI,this::showError);刚刚这里发送的固定值1没有什么实际意义,但是我觉得比较有参考意义。您还可以使用Observable.create来创建可观察对象。场景三:多异步请求合并处理有时候在一个项目中,我们会遇到合并多个请求的结果后更新UI的情况。比如在我们的项目中,有一个通知数据是从多个请求地址获取的,然后在APP上展示的需求按时间顺序组合起来。这时候我们可以使用RxJava的zip函数来处理MyServicemyService=retrofit.create(MyService.class);可观察的o1=myService.getNotification1();Observableo2=myService.getNotification2();Observable.zip(o1,o2,this::combiNotification).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(this::updateUI,this::显示错误);publicListcombiNotification(Listn1,Listn2){//TODOmergenotificationlist}zip函数会等待两个请求都完成,然后调用我们的merge方法combNotification,等待merge待处理之前回调subscribe中的方法。场景四:定时轮询RxJava也特别适合处理定时轮询任务。一个典型的例子就是一个APP提交一个任务到后台进行异步处理。假设后台处理大概需要1-2分钟,我们需要在后台定期查询进度更新到UI。传统的方法是使用Handler的postDelay方法。如果用RxJava实现,会很简单。订阅subscription=Observable.interval(2,TimeUnit.SECONDS).map(this::getProgress).takeUntil(progress->progress!=100).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){//TODO完成}@OverridepublicvoidonError(Throwablee){}@OverridepublicvoidonNext(intprogress){//TODO更新进度}});我们每2秒查询一次,直到progress=100,自动终止轮询。上面的RxJava方法都是异步的,比较耗时的调用。考虑到Activity退出时请求还没有完成,我们需要在Activity的OnDestroy方法中取消RxJava调用subscription.unsubscribe();