关于RxJava语法的问题与理解

  最近看到一个blog-RxJava 写到关于Observable数据异步加载的介绍。针对fromCallablejust操作符在使用上的问题来跟大家针对代码进行分析一下:

代码思想

/**
* 数据获取
**/
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语言写出来的。

05-04 00:57