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();