【问题标题】:Why onNext() is updating textview, though observeOn(Schedulars.io()) on a different thread?为什么 onNext() 正在更新 textview,尽管在不同的线程上观察 On(Schedulars.io())?
【发布时间】:2020-12-30 05:43:01
【问题描述】:
Observable.range(11,10).subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(new Observer<Integer>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onNext(@NonNull Integer integer) {
                    textView.setText(String.valueOf(integer));
                    Log.d(TAG, "onNext: "+Thread.currentThread().getName());
                }

                @Override
                public void onError(@NonNull Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

onNext() 应该在单独的线程上运行,但它如何更新主线程上的 textview?

【问题讨论】:

标签: android rx-java2 rx-android


【解决方案1】:

似乎在视图生命周期的最开始,您可以在很短的时间内从主线程更改视图。

当您从主线程直接在onCreate() 中启动线程时,该线程几乎立即返回结果(因为没有实际工作要做)您在调整视图时不会得到CalledFromWrongThreadException .

如果你放了一个短暂的延迟(也许你的机器上有所不同)——对我来说,50ms 就足够了——在线程/Observable 中的工作开始之前,你会看到预期的CalledFromWrongThreadException

Observable.just("first")
  .subscribeOn(Schedulers.newThread())
  .delay(50, TimeUnit.MILLISECONDS)
  .observeOn(Schedulers.newThread())
  .subscribe(item -> {
    textView.setText(item); // after the delay you will get a CalledFromWrongThreadException
  });

这与 RxJava 无关。创建一个立即更新视图的线程会显示相同的行为:

new Thread(new Runnable() {
  @Override
  public void run() {
    textView.setText("foo"); // no CalledFromWrongThreadException
  }
}).start();

看起来这个问题可以追溯到 ViewRootImpl checkThread() 在这种情况下没有被调用。如需进一步了解,请点击以下链接。

尽管如此,对视图的任何更改都应该发生在主线程中。您展示的场景似乎是“幸运”的副作用。

文档

【讨论】:

    【解决方案2】:

    如果你使用Data Binding Library,它允许update the UI off the main thread

    只要不是集合,您就可以在后台线程中更改数据模型。数据绑定在评估期间本地化每个变量/字段以避免任何并发问题。

    【讨论】:

      【解决方案3】:

      observeOn 是一个异步操作,经过处理后,推送到 onNext whixh 的结果旨在在 UI 线程上运行。他们正在为我们改变线程。那不是优势吗?它是 RxJava 的特性

      【讨论】:

      • 这不是答案。问题是:“如何从主线程更新文本视图”!
      • 哦,我猜这不可能发生。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2016-02-01
      • 1970-01-01
      • 2017-05-06
      • 2018-11-02
      相关资源
      最近更新 更多