我遇到了一个非常烦人的问题。我想创建一个Observable,在初始化某个组件之后发出一些值。问题是另一个组件表现很奇怪,并在主线程上回调。
strangeComponent.init(Callback)
它的回调可能是错误或成功:
interface Callback {
fun onError()
fun onSuccess() <-- this is always called on the main thread
}
现在我想创建一个只在init调用完成后才会运行的Observable:
val initSubject = CompletableSubject.create()
<T> fun withInit(call : (ObservableEmitter<T>) -> Unit) =
initSubject
.doOnSubscribe { startInit() }
.andThen(Observable.create{ emitter ->
call(emitter)
})
fun startInit() {
if (!initSubject.hasComplete()) {
strangeComponent.init(object : Callback {
override fun onSuccess() {
// will be called from the main thread
initSubject.onComplete()
}
...
}
}
}
我使用它就像:
withInit {
//---- heavy code ------
it.onNext("Hallo")
it.onNext("World")
//---------
}.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
log("received $it")
}
事实证明重代码部分始终从主调用 线程而不是计算线程。如何访问给定的subscribeOn调度以及如何包装回调以使其线程模型不影响可观察链?
我尝试了所有类型的构造,包括serialized
和AsyncSubject
等
解决这个问题,但它总是一致的。