为什么我能够访问onNext方法RxAndroid中的视图,尽管没有设置observeOn(AndroidSchedulers.mainThread())?

时间:2018-01-16 07:11:00

标签: android multithreading rx-java rx-android

我正在研究RxJava / RxAndroid。我决定通过Observable方法创建Observable.fromCallable,因为它为我们提供了两件重要的事情:

  
      
  1. 在有人订阅Observerable
  2. 之前,不会运行创建发布值的代码   
  3. 创建代码可以在不同的线程上运行。
  4.   

我写的样本如下:

private void testObservableFromCallable() {
    Observable<String> stringObservable = Observable.fromCallable(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return "Hello";
        }
    });

    Subscription subscription = stringObservable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<String>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(String s) {
                    Log.d("LOG_TAG", "Thread name: " + Thread.currentThread().getName());
                    textView.setText(s);
                }
            });
}

一切都好。它工作正常,日志标记显示线程名称为main。这意味着可以onNext()调用mainThread()方法并正确访问textView

现在,当我删除此行observeOn(AndroidSchedulers.mainThread())或将其更改为observeOn(Schedulers.io())时,我感到困惑的是什么。两种情况下,日志标记显示的线程名称都是RxIoScheduler。这不是主线程,但应用程序编译没有错误,textView显示文本&#34; Hello&#34;在屏幕上。

任何人都帮我解释为什么我能够访问主线程外的视图? 非常感谢!

1 个答案:

答案 0 :(得分:1)

框架通常没有做任何事情来检查你是否真的在主线程上。作为来电者,这是你的责任。

非主线程上的一些但不是所有UI小部件访问都会导致崩溃。在这里,你很“幸运”,你的方法调用未检测到线程问题。