我有Observable<String>
执行一些工作。完成后,它会关闭它的连接(通过.setDisposable(Disposables.fromAction(logic*);
。麻烦的是,我需要在与实际工作负载相同的调度程序上执行此关闭操作。
有可能吗?怎么样?
我不想强迫Observable在给定的调度程序上执行,例如 myObservable.subscribeOn(x).unsubscribeOn(x);
;
答案 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
逻辑放弃调度程序(通过终止或异步),否则取消逻辑可能永远不会执行,因为同一池活锁。