RxJava Flowable.create(),如何尊重subscribeOn()线程

时间:2018-12-28 11:26:51

标签: java android kotlin rx-java2

我将自定义库(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)) }

1 个答案:

答案 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,可以将其省略。它主要仅对同步源有效。