Android 为什么onNext()正在更新textview,尽管observeOn(schedular.io())位于不同的线程上? Observable.range(11,10).subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .订阅(新观察员){ @凌驾 订阅时的公共无效(@NonNull-d){ } @凌驾 public void onNext(@NonNull Integer){ setText(String.valueOf(integer)); Log.d(标记“onNext:+Thread.currentThread().getName()); } @凌驾 公共无效onError(@NonNull可丢弃e){ } @凌驾 未完成的公共空间(){ } });
onNext()应该在单独的线程上运行,但是它如何更新主线程上的textview呢?observeOn是一个异步操作,处理后,将结果推送到onNext,而onNext打算在UI线程上运行。他们正在为我们换线,这是一个优势,不是吗?它是RxJava的特性,如果您正在使用,它允许 只要不是集合,就可以在后台线程中更改数据模型。数据绑定在求值期间对每个变量/字段进行本地化,以避免任何并发问题Android 为什么onNext()正在更新textview,尽管observeOn(schedular.io())位于不同的线程上? Observable.range(11,10).subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .订阅(新观察员){ @凌驾 订阅时的公共无效(@NonNull-d){ } @凌驾 public void onNext(@NonNull Integer){ setText(String.valueOf(integer)); Log.d(标记“onNext:+Thread.currentThread().getName()); } @凌驾 公共无效onError(@NonNull可丢弃e){ } @凌驾 未完成的公共空间(){ } });,android,rx-java2,rx-android,Android,Rx Java2,Rx Android,onNext()应该在单独的线程上运行,但是它如何更新主线程上的textview呢?observeOn是一个异步操作,处理后,将结果推送到onNext,而onNext打算在UI线程上运行。他们正在为我们换线,这是一个优势,不是吗?它是RxJava的特性,如果您正在使用,它允许 只要不是集合,就可以在后台线程中更改数据模型。数据绑定在求值期间对每个变量/字段进行本地化,以避免任何并发问题 似乎在视图生命周期的最开始,有一个非常短的时间跨度,您可以在主线程之外更改视图 当您直接在onCreate()
似乎在视图生命周期的最开始,有一个非常短的时间跨度,您可以在主线程之外更改视图 当您直接在
onCreate()
中从主线程启动一个线程时,该线程几乎立即返回一个结果(因为没有实际的工作要做),您在调整视图时将不会得到一个名为的FromErrorThreadException
如果在线程中的工作/可观察开始之前,您在机器上放置一个短延迟(可能不同)-对我来说,50ms
就足够了,您将看到预期的调用FromErrorThreadException
Observable.just(“第一”)
.subscribeOn(Schedulers.newThread())
.延迟(50,时间单位为毫秒)
.observeOn(Schedulers.newThread())
.订阅(项目->{
textView.setText(item);//延迟后,您将获得CalledFromErrorThreadException
});
这与RxJava无关。创建立即更新视图的线程会显示相同的行为:
new线程(new Runnable()){
@凌驾
公开募捐{
textView.setText(“foo”);//没有调用错误线程异常
}
}).start();
看起来这个问题回到了checkThread()
,在本例中没有调用它。如需进一步了解,请点击以下链接
尽管如此,对视图的任何更改都应该从主线程进行。您所展示的场景似乎是一个“幸运”的副作用
文档
onNext()
,尽管observeOn(Schedulers.io())
?@ChandrimGayen,您能在github上发布最小示例项目并将其发布到此处吗?我不知何故认为还有更多的事情在进行,这是不可能猜到的。@ChristianB,好吧,我将创建一个git,但这需要时间。@ChristianB,[这不是答案。问题是:“如何在主线程之外更新textview”!哦,我想这不可能发生。
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() {
}
});