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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM