如何在RxJava中取消取消订阅上的Observable?

时间:2019-08-24 00:53:39

标签: rx-java reactive-programming rx-java2

我有以下课程:

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事件中如何观察到破坏?

1 个答案:

答案 0 :(得分:1)

最后一个订阅完成后,可观察对象将被正确清理。您提供的信息似乎没有问题。

每次调用getFlowable()时,都会创建一个新的观察者链。 Observable.interval()运算符使用Schedulers.computation()执行程序来获取要运行的新线程。

不清楚您想发生什么。您是否希望可观察对象在同一线程上运行?您是否只希望使用一小部分线程?