千家信息网

RxJava中的Single和Completable是什么

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,这篇文章主要介绍"RxJava中的Single和Completable是什么",在日常操作中,相信很多人在RxJava中的Single和Completable是什么问题上存在疑惑,小编查阅了各式资料,
千家信息网最后更新 2024年12月13日RxJava中的Single和Completable是什么

这篇文章主要介绍"RxJava中的Single和Completable是什么",在日常操作中,相信很多人在RxJava中的Single和Completable是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"RxJava中的Single和Completable是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在大多数 RxJava 示例代码和教程中出现最为频繁的一个类 —— Observable,它是产生响应式编程魔力的关键。它的用法很简单,只需要跟踪 3 个事件,onNextonErroronCompleted就可以应用上百个操作符来实现自己的表达式。那么为什么你还需要了解其他东西?

但是你仔细思考下,你真的需要每次都知道这 3 个事件吗?实际上,在大多数情况下并不需要。ReactiveX 文档中讲述的基本都是关于连续的事件流,因此我们经常忘记通常我们关心的只是监听单一事件或者只监听 completed or failed 事件。

在这种情况下我们应该考虑用 RxJava 的两个绝妙的设计 —— SingleCompletable,在分析两者之前,让我们先看看他们应用场景的示例。

本文中所有代码都是基于 RxJava 2.x ,不是 1.x 版本。如果你还没升级 RxJava 到***的 2.x 版本, 强烈建议你马上升级。

Single

在 Android 中使用 RxJava 最常见的场景就是网络请求,你可能使用 Retrofit 作为项目的 Http client。假设你有一个 GET HTTP 请求返回一些数据,同时使用 RxJavaAdapter 你大概会这么写:

public interface APIClient {@GET("my/api/path")Observable getMyData();}

上面的代码没什么问题,当调用它时:

apiClient.getMyData()    .subscribe(new Consumer() {@Overridepublic void accept(MyData myData) throws Exception {// handle data fetched successfully}    }, new Consumer() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error event}    }, new Action() {@Overridepublic void run() throws Exception {// handle on complete event}    });

仔细思考下,其实这个网络请求并不是一个连续事件流,你只会发起一次 Get 请求返回数据并且只收到一个事件。我们都知道这种情况下 onComplete 会紧跟着 onNext 被调用,那为什么不把它们合二为一呢?

在上面这种情况下为了更清楚的体现请求的意图,应该用Single替换 Observable。从官方文档中对 Single 的说明可以发现为什么它是最恰当的选择:A Single is something like an Observable, but instead of emitting a series of values — anywhere from none at all to an infinite number — it always either emits one value or an error notification。所以修改后 API client 是这样的:

public interface APIClient {@GET("my/api/path")Single getMyData();}

同时请求的调用也可以简化:

apiClient.getMyData()    .subscribe(new Consumer() {@Overridepublic void accept(MyData myData) throws Exception {// handle data fetched successfully and API call completed}    }, new Consumer() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error event}    });

最值得高兴的是 Single 基本上实现了 Observable 所有的操作符 —— mapflatMapfilterzip等,如果你发现需要用到一个 Observable 的操作符而 Single 并不支持,你可以用toObservable操作符把Single转换为Observable

apiClient.getMyData()    .toObservable()// This is an Observable now

如果你有 Observable 表现地像 Single 一样,也可以通过singleOrError操作符转换为 Single。

Completable

继续讨论 Retrofit 的例子,再看看另外一种常用场景 —— 通过 PUT 请求更新数据。我们修改了 MyData 类型对象的一些属性,把它发送到服务器更新服务器数据库。大部分服务器 API 设计都是成功后返回更新后的对象,所以你的 API client 的实现是:

public interface APIClient {@PUT("my/api/updatepath")Observable updateMyData(@Body MyData data);}

同样的,跟之前的例子类似,应该这样调用:

apiClient.updateMyData(myUpdatedData)    .subscribe(new Consumer() {@Overridepublic void accept(MyData myData) throws Exception {// handle data fetched successfully and API call completed}    }, new Consumer() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error event}    }, new Action() {@Overridepublic void run() throws Exception {// handle completion - what we actually care about}    });

你可能会说这里我们可以同样用 Single 来简化代码,是的没错。在这种情况下我们仍然需要 MyData 结果,确定?服务器返回给我们更新后的数据是良好的设计,当时实际上仅仅是返回给我们之前发送给它的对象。我们真正需要的只是更新成功了,这意味着,我只关心 onComplete 事件。

这也是引入Completable的原因,官方文档对它的描述是:Represents a computation without any value but only indication for completion or exception。使用 Completable 时我们忽略 onNext 事件,只处理 onComplete 和 onError 事件,API client 改写为:

public interface APIClient {@PUT("my/api/updatepath")Completable updateMyData(@Body MyData data);}

调用为:

apiClient.updateMyData(myUpdatedData)    .subscribe(new Action() {@Overridepublic void run() throws Exception {// handle completion}    }, new Consumer() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error}    });

Completable 本质上来说和 Observable 与 Single 不一样,因为它不发射数据。因此 Completable 的操作符也有所区别,最常用的是andThen。在这个操作符中你可以传任何ObservableSingleFlowableMaybe或者其他Completable,它们会在原来的 Completable 结束后执行。例如。你想执行一些其他操作(Single):

apiClient.updateMyData(myUpdatedData)    .andThen(performOtherOperation()) // a Single.subscribe(new Consumer() {@Overridepublic void accept(OtherResult result) throws Exception {// handle otherResult}    }, new Consumer() {@Overridepublic void accept(Throwable throwable) throws Exception{// handle error}    });

跟 Single 不同的是 RxJava 不允许直接把 Observable 转换为 Completable,因为没办法知道一个 Observable 什么时候 complete。但是你可以把 Single 转换为 Completable,因为 Single 保证 onComplete 会被调用,这个操作符是toCompletable

到此,关于"RxJava中的Single和Completable是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

事件 操作符 数据 情况 更新 代码 服务器 学习 服务 场景 对象 文档 设计 成功 例子 只是 同时 官方 实际 实际上 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 常州电子网络技术优势 泉州互动安全教育展馆软件开发 杭州系统软件开发如何收费 云服务器查看容器命令 网络电视服务器突然连接不上 华科网络安全员硕博 各个数据库属于第几范式 tp5连接数据库报504 贵州边缘计算服务器云空间 使用数据库gui时 温州网络技术咨询服务电话 数据库日志文件是必须的吗 收银无法连接到数据库 HCNA网络技术实验报告 注意网络安全的心得体会 网络安全法精讲培训 数据传输网络安全问题有哪些 正付网络技术有限公司鲸域 网络安全策划书范文大全 中软国际软件开发怎么样 信息传输是计算机还是网络技术 visual2005连接数据库 腾鸿互联网科技有限公司 软件定义网络技术论文 华科网络安全员硕博 安卓在线数据库hbase 苹果手机用什么网络服务器 软件开发计算机培训学校去哪家好 在哪能查到人口数据库 知富服务器
0