我正在研究RxJava
/ RxAndroid
。我决定通过Observable
方法创建Observable.fromCallable
,因为它为我们提供了两件重要的事情:
- 在有人订阅Observerable
之前,不会运行创建发布值的代码- 创建代码可以在不同的线程上运行。
醇>
我写的样本如下:
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;在屏幕上。
任何人都帮我解释为什么我能够访问主线程外的视图? 非常感谢!
答案 0 :(得分:1)
框架通常没有做任何事情来检查你是否真的在主线程上。作为来电者,这是你的责任。
非主线程上的一些但不是所有UI小部件访问都会导致崩溃。在这里,你很“幸运”,你的方法调用未检测到线程问题。