因此,刚接触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()
函数中。
添加回答
举报
0/150
提交
取消