RxBleConnection与PublishSubject不释放连接

时间:2017-08-21 22:31:40

标签: rx-java rxandroidble

我的应用程序实际上有一个BLE操作队列,可以与我的外围设备一起执行。每个操作都首先建立与外设的连接,返回Observable<RxBleConnection>。队列中的第一项启动连接,后续操作只接收此(共享)RxBleConnection

以简单的形式,队列通过以下方式执行:

Observable.concatDelayError(queuedOperations)

如果无法建立连接,或者在一次操作期间丢弃连接,则每次重试的其余排队操作都会重试,这会尝试重新建立连接。

我决定修改行为,以便一旦连接失效,排队的操作应始终收到现在无效的RxBleConnection,而不是重新建立新连接。重试逻辑仍然执行但在这些情况下立即失败 - 还有其他原因导致操作失败,这与连接无关。

要产生此行为,我会在PublishSubject之后直接撰写Observable<RxBleConnection>。该主题只是委托原始的RxBleConnection ---见下面的代码。如果连接达到错误状态,则后续订阅主题将收到错误;否则,返回共享连接。这正是我想要的行为,它似乎在发生错误时按设计工作;但是,当一切都成功时,我现在遇到了问题。

在更改之前,一旦队列中的所有操作都被使用,连接就会自动释放。但是,通过添加PublishSubject,操作成功,但连接仍然保持打开状态。使用调试语句,我确认从未调用主题onUnsubscribeonTerminate。最初的RxBleConnection最终会超时---并且onUnsubscribeonTerminate会被调用。

想知道我做错了什么导致应用程序保持连接到外围设备。

private Observable.Transformer<RxBleConnection, RxBleConnection> createConnectionSubject() {
    return rxBleConnectionObservable -> {
        final PublishSubject<RxBleConnection> subject = PublishSubject.create();

        rxBleConnectionObservable.subscribe(
            subject::onNext,
            subject::onError,
            subject::onCompleted);

        return subject;
    };
}

1 个答案:

答案 0 :(得分:0)

PublishSubject未将unsubscription事件传递给上游。

也许您应该查看ConnectionSharingAdapter课程?