關於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語言寫出來的。