RxJava 2:总是取消订阅.subscribeOn(..)调度程序?

时间:2016-11-09 14:09:10

标签: android rx-java rx-java2

我有Observable<String>执行一些工作。完成后,它会关闭它的连接(通过.setDisposable(Disposables.fromAction(logic*);。麻烦的是,我需要在与实际工作负载相同的调度程序上执行此关闭操作。

有可能吗?怎么样?

我不想强迫Observable在给定的调度程序上执行,例如 myObservable.subscribeOn(x).unsubscribeOn(x);;

1 个答案:

答案 0 :(得分:2)

您需要一个单线程调度程序才能工作,您可以通过Schedulers.from(Executor)或新SingleScheduler获取一个(警告:内部)。

unsubscribeOn的问题是它只在下游实际处理/取消流时运行(不像1.x几乎所有时间都发生这种情况)。

更好的方法是将using与上述自定义调度程序一起使用,并手动安排清理:

Observable<T> createObservable(Scheduler scheduler) {
    return Observable.create(s -> {
        Resource res = ...

        s.setCancellable(() -> 
            scheduler.scheduleDirect(() ->
                res.close() // may need try-catch here
            )
        );

        s.onNext(...);
        s.onComplete();
    }).subscribeOn(scheduler);
}

Scheduler scheduler = new SingleScheduler();

createObservable(scheduler)
.map(...)
.filter(...)
.subscribe(...);

但请注意,除非create逻辑放弃调度程序(通过终止或异步),否则取消逻辑可能永远不会执行,因为同一池活锁。