关于RxJava语法的问题与理解
最近看到一个blog-RxJava 写到关于Observable数据异步加载的介绍。针对fromCallable
和just
操作符在使用上的问题来跟大家针对代码进行分析一下:
代码思想
/**
* 数据获取
**/
String getMessage() {
Log.d("RxJava", Thread.currentThread().getName());
return "getMessage";
}
/**
* 订阅
**/
Subscriber<Object> getSubscriber() {
return new Subscriber<Object>() {
@Override
public void onCompleted() {
Log.d("RxJava", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d("RxJava", "onError : " + e.toString());
}
@Override
public void onNext(Object o) {
Log.d("RxJava", "onNext : " + o);
Log.d("RxJava", Thread.currentThread().getName());
}
};
}
使用fromCallable
操作符
public void run() {
Observable<String> o = Observable.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return getMessage();
}
});
o.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscriber());
}
使用just
操作符
public void run() {
Observable<String> o = Observable.just(getMessage());
o.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscriber());
}
执行结果上,使用fromCallable
时,getMessage是在子线程执行,而just
是在主线程执行。
原作者给出的结论是
使用Observable.fromCallable()方法有两点好处:
1.获取要发送的数据的代码只会在有Observer订阅之后执行。
2.获取数据的代码可以在子线程中执行。
我觉得这样的结论是有问题,我来修改一个代码,来分析一下:
Observable<String> getObservable(final String s) {
return Observable.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return s;
}
});
}
public void run() {
Observable<String> o = Observable.getObservable(getMessage());
o.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscriber());
}
执行结果发现,getMessage是在主线程执行。
为什么是这样呢?其实这就是Java语言的调用顺序的问题而不是操作符的功能。希望大家学习Rxjava的过程中,不要脱离原有的Java语言结构,毕竟Rajva的源码也是Java语言写出来的。