我有以下课程:
public class Service {
private Observable<Long> obs = Observable.interval(0, 10, TimeUnit.SECONDS);
private Single<Foo> sendFooRequest() {
return Single.fromCallable(() -> sendHttpRequest());
}
public Flowable<Foo> getFlowable() {
return obs
.toFlowable(BackpressureStrategy.BUFFER)
.doOnNext(tick -> log.info("tick: {}", tick))
.flatMapSingle(tick -> sendFooRequest())
.distinctUntilChanged();
}
}
每次连接新客户端时,都会调用getFlowable()
。因此,存在以下情况:
client #1 connects -> disconnects
client #2 connects -> disconnects
client #3 connects
输出看起来如下:
17:33:58.826 INFO 11813 --- [nio-6969-exec-3] ...Service : tick: 0
17:34:01.162 INFO 11813 --- [ionThreadPool-2] ...Service : tick: 19
17:34:02.918 INFO 11813 --- [ionThreadPool-1] ...Service : tick: 94
17:34:03.827 INFO 11813 --- [ionThreadPool-3] ...Service : tick: 1
17:34:06.162 INFO 11813 --- [ionThreadPool-2] ...Service : tick: 20
17:34:07.919 INFO 11813 --- [ionThreadPool-1] ...Service : tick: 95
因此,即使只有一个活动的订阅者,该应用程序仍然使用3个线程(并处理3个可观察对象),并且该应用程序仅创建一个Service
实例。
在unSubscribe
事件中如何观察到破坏?
答案 0 :(得分:1)
最后一个订阅完成后,可观察对象将被正确清理。您提供的信息似乎没有问题。
每次调用getFlowable()
时,都会创建一个新的观察者链。 Observable.interval()
运算符使用Schedulers.computation()
执行程序来获取要运行的新线程。
不清楚您想发生什么。您是否希望可观察对象在同一线程上运行?您是否只希望使用一小部分线程?