Subject.onNext / onComplete不运行subscribeOn线程

时间:2018-06-18 12:06:04

标签: java kotlin rx-java reactive-programming

我遇到了一个非常烦人的问题。我想创建一个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调度以及如何包装回调以使其线程模型不影响可观察链?

我尝试了所有类型的构造,包括serializedAsyncSubject等 解决这个问题,但它总是一致的。

0 个答案:

没有答案