如何避免外部调用来更改流的线程

时间:2019-03-22 12:28:29

标签: rx-java2

问题

使用第三方库生成新线程并使用该新线程返回值时,我面临一个问题。它改变了整个下游链的线程。

代码

代码将是这样的,它调用一个用例并订阅特定的调度程序:

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);
    }
}

0 个答案:

没有答案