關於RxJava語法的問題與理解
最近看到一個blog-RxJava 寫到關於Observable數據異步加載的介紹。針對fromCallable
和just
操做符在使用上的問題來跟你們針對代碼進行分析一下:php
/** * 數據獲取 **/ 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
操做符java
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
是在主線程執行。ide
原做者給出的結論是
使用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語言寫出來的。code