0
我想鏈接幾個可觀察對象並根據可觀察對象執行什麼操作。但我面對奇怪的行爲。Android RxJava和可觀察鏈接
class MainActivity : AppCompatActivity() {
val TAG: String = MainActivity::class.java.name
private lateinit var clicker: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
clicker = findViewById(R.id.clicker) as TextView
clicker.setOnClickListener {
val i = AtomicInteger()
getFirstObservable()
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext {
showMessage(i, it)
}
.flatMap { getSecondObservable() }
.doOnNext {
showMessage(i, it)
}
.flatMap { getThirdObservable() }
.doOnNext {
showMessage(i, it)
}
.subscribe()
}
}
fun getFirstObservable(): Observable<String> {
return Observable.fromCallable {
Thread.sleep(2000)
"Hello"
}
}
fun getSecondObservable(): Observable<Int> {
return Observable.fromCallable {
Thread.sleep(2000)
3
}
}
fun getThirdObservable(): Observable<String> {
return Observable.fromCallable {
Thread.sleep(2000)
"World!"
}
}
fun showMessage(i: AtomicInteger, obj: Any) {
val msg = "Message #${i.incrementAndGet()}: from ${Thread.currentThread().name}: $obj"
Log.e(TAG, msg)
clicker.text = msg
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
}
}
在這個例子中的日誌會顯示每2秒,但是當最後一個可觀察將完成並享有所有變更都被完成。
12-04 01:11:30.465 19207-19207/com.googlevsky.rxtest E/com.googlevsky.rxtest.MainActivity: Message #1: from main: Hello
12-04 01:11:32.473 19207-19207/com.googlevsky.rxtest E/com.googlevsky.rxtest.MainActivity: Message #2: from main: 3
12-04 01:11:34.479 19207-19207/com.googlevsky.rxtest E/com.googlevsky.rxtest.MainActivity: Message #3: from main: World!
我認爲這是)AndroidScheduler.mainThread(的行爲,因爲當我刪除此行,敷,享有變化這樣
Handler(Looper.getMainLooper()).post {
clicker.text = msg
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
}
行爲變得正確。那麼有人可以解釋這種行爲並提出解決這個問題的正確方法嗎?
doOnNext/flatMap和其他不在主線程中調用。 observeOn - 爲傳遞給subscribe()方法的param設置調度器。 – Ufkoku
@Ufkoku我添加日誌的問題。 doOnNext在主線程上調用 – dewarder