返回

RxJava2系列之eighth:Subject与Observable+Observer的关系辨析

Android

RxJava2系列第八话:Subject与Observable + Observer混淆指北

嗨,大家好!又是一个美好的一天,我们来学点新东西吧!希望大家一切顺利!这是我们RxJava2 Android系列的第八篇文章([第一话][1],[第二话][2],[第三话][3],[第四话][4],[第五话][5],[第六话][6],[第七话][7],[第八话][8])。在本文中,我们将讨论Subject、Observable和Observer之间的关系。这是一个令许多初学者感到困惑的概念,但我们将以一种非常简单的方式对其进行分解。

让我们从一个类比开始。假设你正在组织一个派对,你需要邀请一些人。您可以采用两种方法来做到这一点:

  • 您可以逐个给每个人打电话,邀请他们参加派对。
  • 您可以创建一个群组聊天,并向所有人发送一条消息,邀请他们参加派对。

第一种方法类似于回调,其中您逐个调用函数来完成任务。第二种方法类似于响应式编程,其中您使用数据流来通知感兴趣的各方。

在RxJava2中,Observable类似于群组聊天,Subject类似于主持人,Observer类似于参与者。Observable发出数据流,Subject充当中介,将数据流传递给Observer。Observer订阅Observable以接收数据流。

现在,让我们通过一个代码示例来说明这一点:

// 创建一个Observable
Observable<Integer> observable = Observable.just(1, 2, 3, 4, 5);

// 创建一个Subject
Subject<Integer> subject = PublishSubject.create();

// 将Observable订阅到Subject
observable.subscribe(subject);

// 创建一个Observer
Observer<Integer> observer = new Observer<Integer>() {
    @Override
    public void onNext(Integer integer) {
        System.out.println(integer);
    }

    @Override
    public void onError(Throwable throwable) {
        System.out.println(throwable.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("Completed");
    }
};

// 将Observer订阅到Subject
subject.subscribe(observer);

// 发出数据流
observable.subscribe(subject);

在上面的示例中,Observable发出数据流1、2、3、4、5。Subject将数据流传递给Observer。Observer打印数据流并输出“已完成”。

我希望这个例子能帮助您理解Subject、Observable和Observer之间的关系。如果您有任何疑问,请随时发表评论。

在下一篇文章中,我们将讨论RxJava2中的操作符。敬请期待!