美文网首页
深入浅出RxJava(一基础篇)

深入浅出RxJava(一基础篇)

作者: 优疏 | 来源:发表于2016-04-21 15:56 被阅读244次

    RxJava在Android开发中越来越流行,RxJava最核心的两个东西是Observables(被观察者、事件源)和Subscribers(观察者)。Observables发出一系列事件,Subscribers处理这些事件,这里的事件可以是任何你感兴趣的东西,比如触摸事件、web接口调用返回的数据等。


    基础

    Observable可以发出多个事件,知道结束或者出错。每发出一个事件,就会调用与它绑定的Subscriber的onNext方法。最后调用Subscriber.onNext()或者Subscriber.onError()结束

    Rxjava看起来很像设计模式中的观察者模式,但是有一点明显不同,那就是如果一个Observable没有任何Subscriber,那么这个Observable是不会发出任何事件的。

    • Hello World案例
    //创建一个Observable对象,直接调用Observable.create即可
    Observable<String> mObservable = Observable.create( new Observable.onSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> sub) {
             sub.onNext("Hello world");
             sub.onCompleted();
        }
    };
    
    

    这里定义的Observable对象仅仅发出一个hello world字符串,然后就结束了。然后我们创建一个Subscriber来处理Observable对象发出的字符串

    Subscriber<String> mySubsriber = new Subscriber<String>() {
        @Override
        public void onCompleted() {    }
        @Override
        public void onError(Throwable throwable) {    }
        @Override
        public void onNext(String s) {
          system.out.println(s);
        }
    };
    myObservable.subscribe(mySubsriber);
    

    这里subsriber仅仅就是打印Observable发出的字符串,通过subscribe函数可以将我们定义的myObservable对象和mySubscriber对象关联起来,这样就完成Subscriber和Observable的订阅。一旦订阅后,myObservable就会调用mySubscriber对象onNext和onComplete方法,mySubscriber就会打印出Hello world。

    等价于

    Rxjava其实提供了很多便捷函数来帮助我们来减少代码。
    1.利用Observable.just创建只发出一个事件就结束的Observable对象。

    Observable<String> mOb = Observable.just("hello world");
    

    2.接下来简化Subscriber,其实我们关心的是onNext的一些处理。可以使用Action1类。
    subscribe有一个重载方法,接受三个Action1类型的参数,分别对应onNext、onComplete、onError函数;

    myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction); 
    

    最终简化代码

    Observable.just("hello world").subscribe(new Action1<String>() {
         @Override  
            public void call(String s) {  
                  System.out.println(s);  
            }
    });
    
    或者使用java8的ambda使代码更简洁
    Observable.just("hello world").subscribe(s -> System.out.println(s));
    

    Android开发中,强烈推荐使用retrolambda这个gradle插件,这样你就可以在你的代码中使用lambda了。

    操作符

    操作符就是为了解决对Observable对象的变换问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。Rxjava提供了很多很有用的操作符。

    • map操作符:用来把一个事件转换为另一个事件
    //打印Hello world -Dan
    Observable.just("hello world")
            .map(new Func1<String, String>() {
                @Override
                public String call(String s) {
                    return s + " -Dan";
                }
            }).subscribe(s -> System.out.print(s));
    或
    Observable.just("hello world").map(s -> s + " -Dan").subscribe(s -> System.out.print(s));
    

    map()操作符就是用于变换Observable对象的,map操作符返回一个Observable对象,在一个Observable对象上可以多次使用map操作符,最终把最简洁的数据传递给Subscriber对象。map操作符更有趣的一点是它不必返回Observable对象返回的类型,你可以使用map操作符返回一个发出新的数据类型的observable对象。

    Observable.just("Hello, world!")  
        .map(new Func1<String, Integer>() {  
            @Override  
            public Integer call(String s) {  
                return s.hashCode();  
            }  
        })  
        .subscribe(i -> System.out.println(Integer.toString(i))); 
    OR
    Observable.just("Hello, world!")  
        .map(s -> s.hashCode())  
        .subscribe(i -> System.out.println(Integer.toString(i)));  
    

    前面说过,Subscriber做的事情越少越好,我们再增加一个map操作符

    Observable.just("Hello, world!")  
        .map(s -> s.hashCode())  
        .map(i -> Integer.toString(i))  
        .subscribe(s -> System.out.println(s)); 
    

    总结

    1.Observable和Subscriber可以做任何事情
    Observable可以是一个数据库查询,Subscriber用来显示查询结果;Observable可以是屏幕的点击事件,Subscriber用来响应点击事件;Observable可以是一个网络请求,Subscriber用来显示请求结果。
    2.Observable和Subs是独立于中间的变换过程
    在Observable和Subscriber中间可以增减任何数量map,整个系统是高度可组合的,操作数据是一个很简单的过程。

    相关文章

      网友评论

          本文标题:深入浅出RxJava(一基础篇)

          本文链接:https://www.haomeiwen.com/subject/cqutrttx.html