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

  • 相关阅读:
    Flutter DraggableScrollableSheet 可滚动对象的容器
    Flutter 避免阻塞ui线程
    Android Kotlin 数据驱动模板
    ng mock服务器数据
    rxjs 常用的subject
    Flutter 在同一页面显示List和Grid
    dart2native 使用Dart 在macOS,Windows或Linux上创建命令行工具
    Flutter 创建透明的路由页面
    ng 发布组件库
    js实现单张或多张图片持续无缝滚动
  • 原文地址:https://www.cnblogs.com/assassin-l/p/5355190.html
Copyright © 2011-2022 走看看