Java 如何取消PublishSubject和BehaviorSubject的订阅?

Java 如何取消PublishSubject和BehaviorSubject的订阅?,java,rx-java,subject-observer,Java,Rx Java,Subject Observer,在subjects包下,您有PublishSubject和BehaviorSubject之类的类,我认为它们可以被描述为一些可用的示例可观察对象 如何取消这些科目的订阅?没有unsubscribe方法,调用onCompleted可以完全结束观察,对吗?受试者本质上既是观察者也是观察者 一个可观察的本质上是一个拥有一个函数的东西,该函数接受一个观察者并返回一个订阅。因此,例如,给定简单的可观测值: Observable<Integer> observable = Observa

subjects
包下,您有
PublishSubject
BehaviorSubject
之类的类,我认为它们可以被描述为一些可用的示例
可观察对象


如何取消这些科目的订阅?没有
unsubscribe
方法,调用
onCompleted
可以完全结束观察,对吗?

受试者本质上既是观察者也是观察者

一个可观察的本质上是一个拥有一个函数的东西,该函数接受一个观察者并返回一个订阅。因此,例如,给定简单的可观测值:

    Observable<Integer> observable = Observable.create(new Observable.OnSubscribeFunc<Integer>() {
        @Override
        public Subscription onSubscribe(Observer<? super Integer> observer) {
            observer.onNext(3);
            observer.onNext(2);
            observer.onNext(1);
            observer.onCompleted();

            return Subscriptions.empty();
        }
    });

您可以通过调用
subscription.unsubscribe()

Subject
是一个
可观察的
和一个
观察者
以同样的方式取消订阅。同时,它可以像正常的可观察者一样取消订阅。主体的特殊之处在于,它是观察者和观察者之间的桥梁。它可以通过重新发射来通过观察到的项目,也可以发射新的项目。主体是可观察的,就像承诺是未来

以下是受试者家庭的简要说明:

AsyncSubject:仅发出可观测源的最后一个值

行为主体:当观察者订阅时,发出最近发出的项以及源可观察的所有后续项

PublishSubject:发出订阅时可观察到的源的所有后续项

ReplaySubject:无论订阅方何时订阅,都会发出源可观测的所有项


提供了一些漂亮的大理石图表,使所有
主题更容易理解

扩展
可观察
,您可以使用多种
订阅(…)
方法中的任何一种订阅。调用任何
subscribe(…)
方法都会返回
订阅

Subscription subscription = anySubject.subscribe(...);
当您想停止收听主题的事件时,请使用此
subscription
实例的
unsubscripte()
方法

subscription.unsubscribe();

您能描述一下我们如何让订阅者并行处理onNext吗?如果有多个订阅者而不是一个订阅者,我们如何让他们在中执行parallel@vach-根据上面的代码,您可以通过如下操作使订阅服务器并行处理onNext:
subscriptionsubscription1=publishSubject.observeOn(Schedulers.newThread()).Subscription(…)
subscriptionsubscription2=publishSubject.observeOn(Schedulers.newThread()).Subscription(…)
我一直想知道如何做到这一点,直到现在我才明白,thx@praveer09:)BehaviorSubject与ReplaySubject(1)基本相同吗?@DzmitryLazerka:BehaviorSubject总是有一个初始值。如果您正在查找没有初始值的BehaviorSubject,请使用ReplaySubject(1)。答案很好,但稍有更正-ReplaySubject还可以在create()中指定缓冲区,订阅时要发出的项目数是多少PublishSubject呢?@IgorGanapolsky-
anySubject
可以是任何类型的主题,因此同样适用于
PublishSubject
Subscription subscription = anySubject.subscribe(...);
subscription.unsubscribe();