【发布时间】:2019-07-28 05:39:46
【问题描述】:
我已经测试过了,肯定是从主线程发出值会导致这个问题。但是,我想知道我是否有这个用例从主线程接收一些值以继续 Rx 流。应该怎么做才能使 flatMap 在不同于 main 的线程中运行。
class MainActivity : AppCompatActivity() {
private lateinit var emitter: ObservableEmitter<String>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnFlatMap.setOnClickListener {
val obs = Observable.create<String> {
emitter = it
logThread("inside observable")
// TODO: fetch some configuration from the internet or local db
// TODO: then call startActivityForResult()
}
obs
.flatMap {
logThread("flatMap, Banana")
Observable.just("$it, 1 Item")
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ next ->
logThread("onNext")
}, { error ->
logThread("onError")
}, {
logThread("onComplete")
})
}
btnEmitter.setOnClickListener {
// TODO: simulate that onActivityResult is called
emitter.onNext("Banana")
emitter.onComplete()
}
}
private fun logThread(operation: String) {
Log.e("THREAD", "$operation run at [${Thread.currentThread().name}]")
} }
当前的 Logcat
在 [RxCachedThreadScheduler-1] 的 observable 内部运行
flatMap, Banana 在 [main] 运行
onNext 在 [main] 运行
onComplete 在 [main] 运行
预期的 Logcat
在 [RxCachedThreadScheduler-1] 的 observable 内部运行
flatMap, Banana 在 [RxCachedThreadScheduler-1] 运行
onNext 在 [main] 运行
onComplete 在 [main] 运行
【问题讨论】:
标签: android rx-java2 rx-android