【问题标题】:Rxjava AndroidSchedulers.mainThread() means UI thread?Rxjava AndroidSchedulers.mainThread() 表示UI线程?
【发布时间】:2020-08-24 20:49:44
【问题描述】:

我的代码是这样的:

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

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

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

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

【问题讨论】:

  • 堆栈跟踪是否指向adapter.notifyDataSetChanged()? Mb 错误在链的另一部分?一般来说,是的,mainThread() 表示 android 的 UI 线程。
  • 我不知道如何判断stacktrace是否指向adapter.notifyDataSetChanged

标签: android rx-java


【解决方案1】:

问题在于这里的代码:

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

如您所见,您无法订阅 UI 线程,您会收到异常:

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

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

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

【讨论】:

    【解决方案2】:

    这样的事情会起作用:

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

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多