我将自定义库(dataClient
)回调API包装到RxJava Flowable。 dataClient
使用其自己的线程,因此在其自己的线程上调用其回调。
在我的Rx链中,我尝试使用.subscribeOn(Schedulers.computation())
指定计算调度程序。不过,当我在我的Rx链上打印线程名称时,我正在获得我的dataClient
线程。
我应该怎么做才能使Flowable使用.subscribeOn()
中指定的线程?
Flowable.create({ emitter ->
dataClient.setCallback(object : Callback {
override fun message(message: DataModel) {
emitter.onNext(vehicle)
}
override fun done() {
emitter.onComplete()
}
})
emitter.setCancellable {
dataClient.setCallback(null)
}
}, BackpressureStrategy.BUFFER)
.subscribeOn(Schedulers.computation())
.doOnNext { Log.e("DATA", Thread.currentThread().name) }
.observeOn(AndroidSchedulers.mainThread())
.subscribe { data -> Log.d("DATA", "Got data" + data.id)) }
答案 0 :(得分:1)
subscribeOn
调度程序可确保在相关线程上完成预订。订阅恰好发生一次,与observeOn
调度程序的处理方式不同,该调度程序在新线程上调度元素的发射。
Flowable.create({ emitter ->
// this runs with the computation scheduler
dataClient.setCallback(object : Callback {
override fun message(message: DataModel) {
// this runs on the thread it's called from
emitter.onNext(vehicle)
}
override fun done() {
// this runs on the thread it's called from
emitter.onComplete()
}
})
emitter.setCancellable {
dataClient.setCallback(null)
}
}, BackpressureStrategy.BUFFER)
.subscribeOn(Schedulers.computation())
.doOnNext {
// this runs on the thread of the onNext call
Log.e("DATA", Thread.currentThread().name)
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
// this runs on the main thread
data -> Log.d("DATA", "Got data" + data.id))
}
由于您的订阅代码没有被阻塞并且不维护发出线程,因此不需要设置subscribeOn
,可以将其省略。它主要仅对同步源有效。