Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 为什么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()

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

observeOn是一个异步操作,处理后,将结果推送到onNext,而onNext打算在UI线程上运行。他们正在为我们换线,这是一个优势,不是吗?它是RxJava的特性,如果您正在使用,它允许

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


似乎在视图生命周期的最开始,有一个非常短的时间跨度,您可以在主线程之外更改视图

当您直接在
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()
,在本例中没有调用它。如需进一步了解,请点击以下链接

尽管如此,对视图的任何更改都应该从主线程进行。您所展示的场景似乎是一个“幸运”的副作用

文档


请查看此描述:@HansWurst,您能解释为什么在主线程上调用
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() {

                }
            });