[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

相关文章
相关标签/搜索