【发布时间】:2018-11-04 09:44:01
【问题描述】:
在Observable.retryWhen 的Javadoc 示例中,AtomicInteger 用于counter,而不是更简单的常规Int。这真的有必要吗?在什么情况下errors 可以在不同的线程上发出?
我阅读文档和源代码表明 takeWhile 和 flatMap 闭包始终保证在同一线程上运行。
Observable.timer(1, TimeUnit.SECONDS)
.doOnSubscribe(s -> System.out.println("subscribing"))
.map(v -> { throw new RuntimeException(); })
.retryWhen(errors -> {
AtomicInteger counter = new AtomicInteger();
return errors
.takeWhile(e -> counter.getAndIncrement() != 3)
.flatMap(e -> {
System.out.println("delay retry by " + counter.get() + " second(s)");
return Observable.timer(counter.get(), TimeUnit.SECONDS);
});
})
.blockingSubscribe(System.out::println, System.out::println);
【问题讨论】:
-
如果是 int 代码将无法编译,因为捕获的局部变量必须是有效的 final。
-
在 Kotlin 中这不是问题。只需声明为
var counter = 0 -
当然,但是您发布的是 Java,而不是 Kotlin。
标签: kotlin thread-safety rx-java rx-java2 reactivex