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

  • 相关阅读:
    nginx启动报错nginx: [error] open() "/usr/local/etc/nginx/logs/nginx.pid" failed
    JS实现斐波那契数列的几种方法
    CSS选择器有哪些?选择器的优先级如何排序?
    JS将扁平化的数据处理成Tree结构
    OpsAny-项目资源管理-cmdb表创建
    python异常的处理
    Linux系统安装java jdk
    mysql binlog日志解析
    MySQL 数据备份与同步
    linux下shell脚本中sed命令的用法
  • 原文地址:https://www.cnblogs.com/assassin-l/p/5355190.html
Copyright © 2011-2022 走看看