渴望 英语

在教学和指导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

渴望 英语

渴望 英语_渴望订阅– RxJava常见问题解答相关推荐

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

    在教学和指导RxJava以及撰写本书之后 ,我注意到某些领域尤其成问题. 我决定发布一些简短的提示,以解决最常见的陷阱. 这是第一部分. Observable和Flowable本质上是惰性的. 这意味 ...

  2. 怀旧服转服显示请选择其他服务器,魔兽世界怀旧服角色转移服务常见问题介绍_角色转移服务常见问题解答-游戏窝...

    <魔兽世界怀旧服>开启角色转服之后,由于魔兽世界怀旧服的初始人数过于庞大,官方决定在指定的服务器内开启角色转移服务,可以让玩家的角色转移到其他服务器,点击下文了解角色转服的常见问题解答哦! ...

  3. flowable背压 取消_使用Flowable.generate()生成可感知背压的流– RxJava常见问题解答...

    flowable背压 取消 RxJava缺少创建无限自然数流的工厂. 这样的流很有用,例如,当您想通过压缩两个事件的顺序来为可能的无限事件流分配唯一的序列号时: Flowable<Long> ...

  4. openwrt固定速率_固定速率与固定延迟– RxJava常见问题解答

    openwrt固定速率 如果您使用的是纯Java,从版本5开始,我们有一个方便的调度程序类,该类允许以固定速率或固定延迟运行任务: import java.util.concurrent.Execut ...

  5. rxjava 背压_背压加载文件– RxJava常见问题解答

    rxjava 背压 事实证明,将文件作为流进行处理非常有效且方便. 许多人似乎忘记了,自Java 8(3年以上!)以来,我们可以很容易地将任何文件变成一行代码: String filePath = & ...

  6. 技术停滞_检测和测试停滞的流– RxJava常见问题解答

    技术停滞 假设您有一个流以不可预测的频率发布事件. 有时您可以预期每秒会有数十条消息,但是偶尔几秒钟都看不到任何事件. 如果您的流是通过Web套接字,SSE或任何其他网络协议传输的,则可能会出现问题. ...

  7. flatmap_flatMap()与concatMap()与concatMapEager()– RxJava常见问题解答

    flatmap RxJava 2.x中共有三个无缝相似的运算符: flatMap() , concatMap()和concatMapEager() . 它们都接受相同的参数-从原始流的单个项目到任意类 ...

  8. 并发查询parallel_惯用并发:flatMap()与parallel()– RxJava常见问题解答

    并发查询parallel 简单,有效和安全的并发是RxJava的设计原则之一. 然而,具有讽刺意味的是,它可能是该库中最容易被误解的方面之一. 让我们举一个简单的例子:假设我们有一堆UUID并且对于每 ...

  9. flatMap()与concatMap()与concatMapEager()– RxJava常见问题解答

    RxJava 2.x中共有三个无缝相似的运算符: flatMap() , concatMap()和concatMapEager() . 它们都接受相同的参数-从原始流的单个项目到任意类型的(子)流的函 ...

最新文章

  1. Struts2——学习(5):页面跳转
  2. C#数组排序(按列)
  3. codeforces E. Games on a CD(双hash)
  4. Java中对象的储存区
  5. HANA report transaction data retrieve in QHD/504
  6. say小组KTV点歌系统简介
  7. [AH/HNOI2017]大佬
  8. alsa的动态库安装在哪里_linux 给运行程序指定动态库路径
  9. 第十一篇:Mysql系列
  10. php pdo insertid,php-在PDO准备好的语句内使用LAST_INSERT_ID插入...
  11. 一次编译安装SENginx 的小经历.....
  12. pokemon go 和 虚拟gps
  13. 安装一个自己的笔记软件——Wiz开源私有云笔记
  14. bbsmax mysql_mysql 常用,使用经验
  15. His系统数据库服务器关系,his系统数据库服务器
  16. Linux下SD卡驱动移植
  17. 学习web前端能做游戏开发吗?
  18. 服务器开机必须要按f1才能进系统,每次开机都要按F1才能进入系统的解决方法...
  19. powerpoint预览_如何添加,删除和重新排列PowerPoint幻灯片
  20. 怎样在word中批量替换文字?Word替换文字这一招你会吗?

热门文章

  1. CodeForces 1610H Squid Game(延迟贪心 + 构造 + 树状数组)
  2. AT2371-[AGC013E]Placing Squares【矩阵乘法】
  3. AT3955-[AGC023D]Go Home【结论,递归】
  4. nssl1448-小智过马路【模拟】
  5. 【动态规划】分组背包 (ssl 2291)
  6. java中Date与DateFormat的格式输出
  7. git创建tag标签
  8. 若依前后端部署之后验证码不显示
  9. 搜索时展示的是名字,传给后端的是id
  10. 2016蓝桥杯省赛---java---B---3(平方怪圈)