千家信息网

RxJava中的Single和Completable是什么

发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,这篇文章主要介绍"RxJava中的Single和Completable是什么",在日常操作中,相信很多人在RxJava中的Single和Completable是什么问题上存在疑惑,小编查阅了各式资料,
千家信息网最后更新 2024年11月12日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安全错误 数据库的锁怎样保障安全 软件与网络技术的区别 软件开发区块链技术 交通银行招聘软件开发工程师 哪个云服务器空间便宜 小吉互联网科技 企查查 近红外人脸数据库 简谱下载软件开发 简述行业软件开发常用平台 asp数据库条件查询语句 农安先进网络技术诚信合作 c 文件存入数据库 重庆安全运维选择东塔网络安全 网络安全管理和电子商务师哪个好 新密直播app软件开发公司 环境和数据库演示是什么意思 关系数据库分布式 北京运维管理软件开发定制 临沂烟草服务器采购项目 手游服务器管理员 唐山市城库网络技术有限公司 安新软件开发项目管理 鄞州直销软件开发教程 互联网健康科技平台排行榜 网络安全宣传周主题对照检查 3大中文电子图书数据库是什么 杭州日报网络安全新闻 计算机网络技术实习考核 比特币是以什么网络技术 永兴电脑软件开发学费多少 连接爱思服务器错误
0