[RxJava]在學習RxJava中的錯誤理解

關於RxJava語法的問題與理解
  最近看到一個blog-RxJava 寫到關於Observable數據異步加載的介紹。針對fromCallablejust操做符在使用上的問題來跟你們針對代碼進行分析一下: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

相關文章
相關標籤/搜索