【问题标题】:Only the original thread that created a view hierarchy can touch its views. RxAndroid只有创建视图层次结构的原始线程才能接触其视图。 RxAndroid
【发布时间】:2017-11-09 14:23:51
【问题描述】:

我尝试使用 RxAndroid

button.setOnClickListener(view -> restApiFactory.testService().getListTest(7)
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<List<Test>>() {

但我收到以下错误:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

我没用过AndroidSchedulers.mainThread()

【问题讨论】:

  • UI 应该从主线程更新,没有逃脱的地方
  • 我知道。但我不知道如何告诉观察者主线程
  • .subscribe(new Observer&lt;List&lt;Te...之前添加这个..observeOn(AndroidSchedulers.mainThread())
  • 我在我的问题中写道 - 我没有 AndroidSchedulers 类
  • 我还说,没有逃脱,你没有AndroidSchedulers class是什么意思?您需要具体说明问题和限制

标签: android retrofit2 rx-android


【解决方案1】:

您需要从主线程操作UI,因此您需要告诉 rxandroid 通知主线程上的更改,因此请使用

button.setOnClickListener(view -> restApiFactory.testService().getListTest(7)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                //              ^^^^^^^^^^
                .subscribe(new Observer<List<Test>>() {

要获得这个,你需要有一个依赖

compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 

并且您当前的依赖项用于进行改造 retuns rxAndroid 类型响应。

【讨论】:

  • 我们不能不添加compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 这个依赖。我们不能使用Schedulers 吗?我尝试使用Schedulers.trampoline() &amp; Schedulers.newThread(),但给了我同样的错误。有什么想法吗?@Pavneet_Singh
  • @MaulikDodia 我认为它应该可以工作,希望你没有使用任何与 UI 相关的工作
  • 它不起作用,这就是我要说的@Pavneet_Singh
【解决方案2】:

你应该使用 observeOn(AndroidSchedulers.mainThread()) 不是 subscribeOn(AndroidSchedulers.mainThread())

用作:-

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

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多