使用第三方库生成新线程并使用该新线程返回值时,我面临一个问题。它改变了整个下游链的线程。
代码将是这样的,它调用一个用例并订阅特定的调度程序:
someUseCase()
.subscribeOn(Schedulers.io())
.subscribe(value -> print("value emitted: " + value))
在用例中,将有许多操作,包括对第三方库的调用:
Completable.defer(() -> {
print("Operations on the chain before calling third party lib");
return Completable.complete();
})
.andThen(callThirdPartyLib())
.flatMap((Function<String, ObservableSource<String>>) s -> {
print("Operations on the chain after calling third party lib");
return Observable.just(s);
})
日志如下所示,请注意线程的变化:
[Thread: RxCachedThreadScheduler-1] Operations on the chain before calling third party lib
[Thread: ThirdPartyLibThread] Operations on the chain after calling third party lib
[Thread: ThirdPartyLibThread] value emitted: third party value new thread
我希望流继续在其最初订阅的线程上运行。
我知道我可以在调用第三方lib之后添加.observeOn(Schedulers.io())
来修复它。但是我不想在UseCase类中对调度程序进行硬编码。
我希望类的用户选择他们希望订阅的调度程序,而不会在中间更改线程。我可以请求调度程序作为UseCase类的参数,但我正在寻找其他替代方法。
使用javadocs中给出的示例,这就是调用第三方库的方式:
private static Observable<String> callThirdPartyLib() {
ThirdPartyLib thirdPartyLib = new ThirdPartyLib();
return Observable.create((ObservableOnSubscribe<String>) emitter -> thirdPartyLib.getData(emitter::onNext))
//.observeOn(Schedulers.io()) // <-- this fixes it
}
这是为了模拟在另一个线程上调用回调的第三方库-不能更改此代码:
private static class ThirdPartyLib {
void getData(Callback callback) {
new Thread(() -> callback.onDataReceived("third party value new thread"), "ThirdPartyLibThread").start();
}
interface Callback {
void onDataReceived(String data);
}
}