关于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