Rxjava AndroidSchedulers.mainThread()表示UI线程?

时间:2016-01-27 02:21:21

标签: android rx-java

我的代码是这样的:

.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe ({
    adapter.notifyDataSetChanged()
})

但是我收到了一个错误:只有创建视图层次结构的原始线程才能触及其视图。 所以我把它改成:

.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe ({
        runOnUiThread(Runnable {
            adapter.notifyDataSetChanged()
 })
 }

这很有道理。所以我很困惑。 我以为.observeOn(AndroidSchedulers.mainThread())意味着订阅块中的代码在ui线程上运行,但我是如何得到这个错误的?

2 个答案:

答案 0 :(得分:6)

问题出在这里的代码:

.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())

你注意到你不能在UI线程上订阅,你会得到一个例外:

  

只有创建视图层次结构的原始线程才能触及其视图。

您应该做的是订阅I / O线程并在UI线程上观察:

.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ()

答案 1 :(得分:0)

类似的事情会起作用:

observerable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) //works Downstream
.subscribe ({
   adapter.notifyDataSetChanged()
})