渴望订阅– RxJava常见问题解答

在教学和指导RxJava以及撰写本书之后 ,我注意到某些领域尤其成问题。 我决定发布一些简短的提示,以解决最常见的陷阱。 这是第一部分。
ObservableFlowable本质上是惰性的。 这意味着无论您在Flowable放置了多么繁琐或长时间运行的逻辑,仅当有人订阅时,它才会被评估。 并且还有某人订阅的次数。 下面的代码段对此进行了说明:

private static String slow() throws InterruptedException {logger.info("Running");TimeUnit.SECONDS.sleep(1);return "abc";
}//...Flowable flo = Flowable.fromCallable(this::slow);
logger.info("Created");
flo.subscribe();
flo.subscribe();
logger.info("Done");

这样的ObservableFlowable将不可避免地打印:

19:37:57.368 [main] - Created
19:37:57.379 [main] - Running
19:37:58.383 [main] - Running
19:37:59.388 [main] - Done

请注意,您需要两次支付sleep()的价格sleep()两次订阅)。 此外,所有逻辑都在客户端( main )线程中运行,除非通过subscriptionOn subscribeOn()请求或异步流隐式可用,否则RxJava中没有隐式线程。 问题是:我们是否可以热切地强制运行订阅逻辑,以便每当有人订阅该流时,就已经对其进行了预先计算或至少开始了计算?

完全渴望评估

最明显但有缺陷的解决方案是急于计算流返回的任何内容,并简单地将其包装为固定的Flowable

Flowable<String> eager() {final String slow = slow();return Flowable.just(slow);
}

不幸的是,这大大破坏了RxJava的目的。 首先,像subscribeOn()这样的运算符将不再起作用,并且无法将计算卸载到其他线程。 更糟糕的是,即使eager()返回了Flowable但按照定义,它将始终阻止客户端线程。 很难推理,组合和管理此类流。 通常,即使需要进行急切的评估,也应避免使用这种模式,而应选择延迟加载。

使用

下一个示例仅使用cache()运算符:

Flowable<String> eager3() throws InterruptedException {final Flowable<String> cached =Flowable.fromCallable(this::slow).cache();cached.subscribe();return cached;
}

这个想法很简单:用惰性Flowable包装计算并缓存它。 cache()运算符所做的是,它会记住第一次订阅时发出的所有事件,以便在出现第二个Subscriber ,它将接收相同的事件缓存序列。 但是cache()运算符(像大多数其他运算符一样)是惰性的,因此我们必须第一次强制订阅。 调用subscribe()将预填充缓存,此外,如果第二个订户出现在slow()计算完成之前,它将同样等待它,而不是第二次启动它。

此解决方案有效,但请记住,由于未涉及Schedulersubscribe()实际上将被阻止。 如果要在后台预填充Flowable ,请尝试subscribeOn()

Flowable<String> eager3() throws InterruptedException {final Flowable<String> cached =Flowable.fromCallable(this::slow).subscribeOn(justDontAlwaysUse_Schedulers.io()).cache();cached.subscribe();return cached;
}

是的,在生产系统上使用Schedulers.io()存在问题且难以维护,因此请避免使用自定义线程池。

错误处理

令人遗憾的是,吞噬RxJava中的异常非常容易。 如果slow()方法失败,这就是我们上一个示例中可能发生的情况。 异常不会完全被吞没,但是默认情况下,如果没有人对此感兴趣,它将在System.err上打印堆栈跟踪。 同样,未处理的异常也包装在OnErrorNotImplementedException 。 如果您执行任何形式的集中式日志记录,则不太方便,很可能会丢失。 您可以使用doOnError()操作进行日志记录,但它仍然通过例外下游RxJava认为未处理的为好,一次包装与OnErrorNotImplementedException 。 因此,让我们在subscribe()实现onError回调:

Flowable<String> eager3() throws InterruptedException {final Flowable<String> cached =Flowable.fromCallable(this::slow).cache();cached.subscribe(x -> {/* ignore */},e -> logger.error("Prepopulation error", e));return cached;
}

我们不想处理实际事件,而只是处理subscribe()错误。 此时,您可以安全地返回此类Flowable 。 急切且有希望的是,只要您订阅了它,数据就已经可用。 注意,例如,Hystrix的observe()方法也很急切,而懒惰的toObservable()相反。 这是你的选择。

翻译自: https://www.javacodegeeks.com/2017/08/eager-subscription-rxjava-faq.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPScan高级用法和定制

自定义扫描选项 WordPress作为一个广泛使用的内容管理系统&#xff08;CMS&#xff09;&#xff0c;为用户提供了丰富的自定义选项&#xff0c;使其能够根据特定需求创建个性化的网站。其中一个重要的自定义选项是自定义扫描选项&#xff0c;它允许用户对WordPress网站进行深度…

r语言中正定矩阵由于误差不正定_R语言之数据处理(一)

在上一篇小文中&#xff0c;提到了关于R语言导入数据的一些方法&#xff0c;之后的重点就转向了数据的处理上。数据处理其实在整个数据分析项目中所占用的时间是比较多的&#xff0c;所以根据处理的目的不同&#xff0c;也有不同的处理方法。在R语言中&#xff0c;我通常会将数…

【chromium】 渲染显示相关概念

DRM(Direct Rendering Manager) DRM 由两个部分组成&#xff1a;一是 Kernel 的子系统&#xff0c;这个子系统对硬件 GPU 操作进行了一层框架封装。二是提供了一个 libdrm 库&#xff0c;里面封装了一系列 API&#xff0c;用来进行图像显示。 说到这里&#xff0c;其实这么理解…

ASP.NET Core MVC 之区域(Area)

区域&#xff08;Area&#xff09;是一个 ASP.NET MVC 功能&#xff0c;用于将相关功能组织为一个单独的命名空间&#xff08;用于路由&#xff09;和文件结构&#xff08;用于视图&#xff09;。使用区域通过向控制器和操作添加 一个路由参数&#xff08;area&#xff09;来创…

esp32 arduino adc_英雄联盟手游射手出装怎么出 adc英雄出装推荐

2020-11-02 18:06:31 角色扮演 人气值&#xff1a;加载中...英雄联盟手游adc怎么出装备&#xff1f;英雄联盟手游虽然没有上线国服和台湾服&#xff0c;但是我们已经有很多热心的玩家在外服中研究出了各种射手的玩法&#xff0c;那么adc要怎么出装呢&#xff1f;小编已经准备…

camel.js_Camel 2.11 –没有Spring的Camel Web应用程序

camel.js在撰写本文时&#xff0c;我们刚刚向即将到来的Apache Camel 2.11添加了一个新组件&#xff0c;该组件允许使用Camel运行Web应用程序&#xff0c;而不必依赖Spring Framework来加速Camel。 或与此相关的任何其他第三方框架。 有点as愧地说&#xff0c;在2013年&#x…

宅男计划

题解 $dp$不行考虑三分 发现单峰 1.理性打表,得到单峰 2.感性思考,你会发现你买食物次数越多,你钱数越少,你买的好食品更多,你买食物次数越少,你钱数越多,然而你必须买一些价格贵保质期长弥补次数少. 单峰,我们三分就完了(其实也可以模拟退火,然而我参数爆炸了一直60分) 那么$c…

.net 后台 下载 图片_特殊的 “图片软件” !

01 引语简单的图片处理软件我说过不少&#xff0c;像windows自带的图片编辑、在线处理图片的稿定设计、或者ps的一些插件。虽然我知道这类工具型软件的文章&#xff0c;大多数小伙伴都只是随便看一眼&#xff0c;心里默念 “咦&#xff0c;好像有用&#xff01;”&#xff0c;…

流操作中的noException

本文介绍了一些简单的编码实践。 没什么好看的。 在StackOverflow上也进行了讨论。 您只是将一个庞大而复杂的循环重构为一个更具可读性的流表达式&#xff0c;而忘记了某些方法调用引发了异常。 包含此代码的方法将引发此异常&#xff0c;该异常在方法头中声明。 您不想在此级…

optimize table 需要多久_吉林市政工程资质新办需要多久

七。 暖通空调专业&#xff1a;水暖工程&#xff0c;建筑环境与设备&#xff0c;环境工程&#xff0c;暖通空调&#xff0c;供暖和通风与空调&#xff0c;制冷和空调&#xff0c;水暖&#xff0c;供暖和通风&#xff0c;HVAC&#xff0c;公共设备安装。如何申请第三级土木工程资…

Java EE 6 开发环境

软件安装&#xff1a; 选择 Glassfish 支持 Java EE 6 的最新版本 3.1.2.2根据 Glassfish 3.1.2 的 certification matrix&#xff0c;要求 JDK 1.6 update 29&#xff0c;因此&#xff0c;选择 JDK 6 最新版本 JDK 6u45选择 Eclipse Indigo&#xff0c;其之后的版本要求 JDK 7…

mysql连接不断线_某些小时后MySql连接自动掉线

mysql连接不断线MySql配置为删除任何闲置超过8小时的连接。 这意味着什么&#xff1f; 在8个小时的间隔后返回到已部署的应用程序之后&#xff08;如果未更改默认SQL参数&#xff09;&#xff0c;将会遇到异常情况。 如何解决这个问题&#xff1f; 增加wait_time参数-不是一个…

pb65 xp 安装无反应_长春优质AFB型耐腐蚀泵安装

长春优质AFB型耐腐蚀泵安装 k5b5b5s长春优质AFB型耐腐蚀泵安装 并及时更换轴套。而随着科技的不断发展&#xff0c;新式设备的问世&#xff0c;设备一般都开始被筛选。无密封自吸泵无密封自吸泵就是一种新式泵&#xff0c;该泵密封可靠&#xff0c;选用无泄漏密封设备&#xff…

虚函数探秘

C的多态分为动态多态和静态多态&#xff0c;其中静态多态主要靠重载和模板来实现&#xff0c;而动态多态则主要靠继承来实现了。 那么静态和动态&#xff0c;怎么算静&#xff0c;怎么算动呢&#xff1f;静态多指编译期能决定的事情&#xff0c;而动态多指运行时才决定的事情。…

Errai框架简介

Errai是Red Hat开发和维护的框架&#xff0c;旨在结合GWT和JEE世界的优点。 根据Red Hat的说法&#xff0c;Errai是基于GWT的框架&#xff0c;用于使用下一代Web技术构建富Web应用程序。 在此简单声明的背后&#xff0c;存在一种与GWT完全不同的开发方式&#xff0c;在下面的文…

动态壁纸安卓_高清无水印!这4款壁纸软件,让你的手机好看又独特

手机与我们每日相伴&#xff0c;我们总会精心挑选各种图片设置为手机壁纸&#xff0c;有时换个壁纸就像换了一种心情一样。但网上搜索的壁纸大同小异&#xff0c;有没有风格独特又有趣的&#xff1f;今天就给大家推荐4款各具特色的壁纸App&#xff0c;保证给你耳目一新的感觉。…

在线生成安卓APP图标

移动应用图标/启动图生成工具&#xff0c;一键生成所有尺寸的应用图标/启动图 在线生成安卓APP图标生成 图标在 线 在线图标 安卓图标 生成图标 https://icon.wuruihong.com/ 在线png图片压缩 png压缩 https://compresspng.com/zh/ 在线gif图片压缩 gif压缩 https://www.soog…

NOIP模拟测试29「爬山·学数数·七十和十七」

爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左面第一个大于当前值的值,极右值为右面第一个大于当前值的值 ,找到最大值…

手机音频拼接软件_良心分享:业界最顶尖的软件!

01短视频的爆火&#xff0c;让全民都接触了“剪辑”要知道在最最最开始大众离它很远&#xff0c;更多是一种职业而非爱好最具影响力的是抖音、B站等平台抖音让更多人接触到了剪辑哔哩让更多人学会剪辑技术虽然抖音的视频时长普遍较短但这并不妨碍剪辑技术的展现比如&#xff0c…

java堆内存和堆外内存_Java堆空间,本机堆和内存问题

java堆内存和堆外内存最近&#xff0c;我正在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多。 代码创建的所有Java对象都是在Java堆空间内创建的&#xff0c;其大小由-Xmx选项定义。 但是一个Java进程由很多空间组成&#xff0c;而不仅仅是Java堆空间…