RxJava中Observable的含义及基本用法

什么是Observable

这里需要先说一下观察者模式,因为Observable从另一个角度讲,它担任了观察者模式中的一个角色。
对于观察者模式,维基百科官方解释是:

观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 — 维基百科

通常我们对于观察者模式的了解可能是这样,这个说法可能更加通俗易懂。

观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。

那我们知道了观察者模式是什么之后,下面开始说一说Observable。
在RxJava中,有四个基本概念:

  1. Observable (被观察者)
  2. Observer (观察者)
  3. Subscribe (订阅)
  4. 事件

Observable和Observer通过Subscribe()方法实现订阅,从而Observable可以在需要的时候发出事件来通知观察者Observer。

这里需要强调的是只有Observable订阅了Observer,Observable才会发送事件。

Observable的分类

Cold Observable

我们经常用到的就是这种,它的特点是一个被观察者对应一个观察者,只有被观察者订阅了观察者,才会开始发送事件,上面强调的也是这个意思。当有多个不同的观察者时,消息(事件)是重新完整发送的,也就是说它们各自的事件是独立的。

 Consumer<Long> subscribe1 = new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Exception {
            System.out.println("subscriber1: "+aLong);
        }
    };
    Consumer<Long> subscribe2 = new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Exception {
            System.out.println("  subscriber2: "+aLong);
        }
    };
    Observable<Long> observable = Observable.create(new ObservableOnSubscribe<Long>() {
        @Override
        public void subscribe(ObservableEmitter<Long> emitter) throws Exception {
            Observable.interval(10, TimeUnit.MILLISECONDS, Schedulers.computation())
                    .take(Integer.MAX_VALUE)
                    .subscribe(emitter::onNext);
        }
    }).observeOn(Schedulers.newThread());
    
    observable.subscribe(subscribe1);
    observable.subscribe(subscribe2);

    //测试结论
    //accept的回调里面打印的subscribe1 和 subscribe2 的结果并不一定是相同的,说明它们两个是完全独立的。

Hot Observable

Hot Observable与观察者们的关系是一对多的关系,可以和多个观察者共享信息。无论有没有观察者进行订阅,事件始终都会被发送。
由于这种用法不多,所以这里就不使用代码做解释了。

Observable的基本使用

其实上面的例子中已经可以看到Observable的基本用法了,下面通过代码抽象出一个简单框架,再次了解一下它的含义及用法,其中这几个角色缺一不可。

  1. 创建Observable
    Observable字面意思是被观察者,可以在这里决定异步操作模块的顺序和异步操作模块的次数。
  2. 创建Observer
    Observer即观察者,它可以在不同的线程中执行任务。可以在未来某一时刻响应被观察者的通知,而不需要阻塞等待Observable发射数据。
  3. 使用subscribe()进行订阅
Observable.just("hello world").subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String s) {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

关于上述代码的一些解释

  1. 使用了just操作符创建了Observable,我们还可以使用create、range等一些操作符来创建,这里不一一举例,有兴趣可以自行查阅相关资料了解用法,其实大同小异。
  2. just()方法里面传递了字符串参数,则会在Observer的回调onNext()方法里面收到这个参数,这个是描述了一边发事件,另外一边可以收到通知的思想。
  3. 关于Observer的回调,onError()和onComplete()方法只会回调其中一个方法,因为他们是冲突的,且只会在最后回调。

单纯从写法上来讲,Observable其实很简单,就是一些固定的格式,写多了自然就记住了。但是我们如果想要了解为什么Observable可以自由切换线程去完成对应的任务,就需要去读一下Observable的源码。

这篇文章是个人学习Observable的一些简单总结,所以不针对源码做过多解释。
最后,如果你想要系统学习一下RxJava,建议看《RxJava 2.x实战》这本书,作者是沈哲。有建议或者不足之处欢迎下方评论留言,抱拳了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值