在 RxAndroid 中使用 PublishSubject 来触发断开连接而不是仅仅取消订阅订阅的目的是什么?

What is the purpose of using a PublishSubject to trigger a disconnect rather than just unsubscribing from a Subscription in RxAndroid?

我正在开发一个使用 RxAndroidBle 进行蓝牙通信的蓝牙项目。我遇到了清理订阅的两种不同方式。我想知道是否有人可以解释每种方法的区别和好处(如果有的话)。两个例子如下

首先:使用PublishSubject触发与蓝牙设备的断开连接

代码示例:https://github.com/Polidea/RxAndroidBle/blob/master/sample/src/main/java/com/polidea/rxandroidble/sample/example4_characteristic/CharacteristicOperationExampleActivity.java

第二:通过取消订阅Subscription

来断开与蓝牙设备的连接

代码示例: https://github.com/Polidea/RxAndroidBle/blob/master/sample/src/main/java/com/polidea/rxandroidble/sample/example2_connection/ConnectionExampleActivity.java

我主要关注每个示例中的 triggerDisconnect() 方法。 PublishSubject 与仅保留对 Subscription 的引用然后取消订阅有何不同?

对于这个问题的开放性,我深表歉意,但我不确定如何更好地解释它。

不,PublishSubject disconnectTriggerSubject 帮助构建 connectionObservable 之前使用此 prepareConnectionObservable() 方法。然后作为代理将 null 传递给 observable 的 onNext() 方法。

然后在这个订阅的onNext()里面:

.subscribe(
      characteristic -> {
           updateUI(characteristic);
           Log.i(getClass().getSimpleName(), "Hey, connection has been established!");
      },
      this::onConnectionFailure,
      this::onConnectionFinished
);

使用 null 值调用 updateUI(characteristic) 方法。

我想我明白了。 .takeUntil(disconnectTriggerSubject)是理解disconnectTriggerSubject的关键。 takeUntil() 意味着从 connection observable 发出的项目(当然是在订阅之后)将一直发出,直到从 disconnectTriggerSubject 发出一个项目。由于 disconnectTriggerSubject 是一个 PublishSubject 它既是观察者又是可观察者。由于它是可观察的,它可以通过 onNext() 方法发出项目。因此,调用 disconnectTriggerSubject.onNext(null) 会导致 takeUntil(disconnectTriggerSubject) 执行,这会阻止 connectionObservable 中的任何新项目被发出。这与取消订阅基本相同,因为它 "Stops the receipt of notifications on the Subscriber that was registered when this Subscription was received." http://reactivex.io/RxJava/javadoc/rx/Subscription.html