zoukankan      html  css  js  c++  java
  • [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语言写出来的。

  • 相关阅读:
    C++ 动态链接库、静态链接库
    WIN32 PE结构 重定位表
    WIN32 PE Bound Import 绑定导入表
    WIN32申请内存 物理页 VirtualAlloc VirtualFree
    PE文件结构详解 PE导入表
    PE文件结构详解 PE导出表
    WIN PE文件插入MessageBox
    WIN32 创建窗口 WNDCLASS 和CreateWindow
    053464
    053463
  • 原文地址:https://www.cnblogs.com/assassin-l/p/5355190.html
Copyright © 2011-2022 走看看