[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语言写出来的。

原文地址:https://www.cnblogs.com/assassin-l/p/5355190.html