为了账号安全,请及时绑定邮箱和手机立即绑定

可观察vs可完成为什么不调用可完成任务?

可观察vs可完成为什么不调用可完成任务?

小怪兽爱吃肉 2021-04-12 21:41:55
因此,刚接触RX Java的人有一个问题。在我学习作为RXJava的野兽的探险中,这是我受测的课程。public class PollingLoop {public static <T> Observable<T> buildObservable(    final int interval,    final TimeUnit timeUnit,    final int maxJitter,    final Scheduler scheduler,    final Supplier<Observable<T>> scheduledTask) {    if (maxJitter <= 0) throw new IllegalArgumentException("Jitter must be greater than 0");    final Random randomJitter = new Random();    return Observable.timer(interval, timeUnit, scheduler)        .map(x -> {            System.out.println("Flat map jitter");            return randomJitter.nextInt(maxJitter);        })        .flatMap(jitter -> {            System.out.println("Flat map timer");            return Observable.timer(jitter, timeUnit, scheduler);        })        .flatMap(ignored -> {            System.out.println("Flat map task");            return scheduledTask.get();        })        .retry()        .repeat();}public static <T> Completable buildCompletable(    final int interval,    final TimeUnit timeUnit,    final int maxJitter,    final Scheduler scheduler,    final Supplier<Completable> scheduledTask) {    if (maxJitter <= 0) throw new IllegalArgumentException("Jitter must be greater than 0");    final Random randomJitter = new Random();    return Observable.timer(interval, timeUnit, scheduler)        .map(x -> {            System.out.println("Flat map jitter");            return randomJitter.nextInt(maxJitter);        })        .flatMapCompletable(jitter -> {            System.out.println("Flat map timer");            return Completable.timer(jitter, timeUnit, scheduler);        })        .flatMapCompletable(ignored -> {            System.out.println("Flat map task that is not called");            return scheduledTask.get();        })        .retry()        .repeat()        .toCompletable();}}从测试中,当我测试Observable的执行延迟时,得到输出Flat map jitterFlat map timerFlat map task //(observable is being called)我究竟做错了什么?为什么未从buildCompletable内部调用Completable任务?
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

您的第flatMapCompletable()一个结果是可完成的,因为这就是您要返回的结果。但是,该可填充对象将永远不会发出值(根据定义),因此后继flatMapCompletable()映射没有任何值。

由于您的第一个Completable不发出值,因此您将需要使用andThen()运算符或类似方法绑定下一步。

因为flatMapCompletable()操作符具有的签名,所以您的代码得以编译Observable<Long>。您将需要将andThen()运算符放入flatMapCompletable()函数中。


查看完整回答
反对 回复 2021-04-28
  • 1 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信