我的应用程序实际上有一个BLE操作队列,可以与我的外围设备一起执行。每个操作都首先建立与外设的连接,返回Observable<RxBleConnection>
。队列中的第一项启动连接,后续操作只接收此(共享)RxBleConnection
。
以简单的形式,队列通过以下方式执行:
Observable.concatDelayError(queuedOperations)
如果无法建立连接,或者在一次操作期间丢弃连接,则每次重试的其余排队操作都会重试,这会尝试重新建立连接。
我决定修改行为,以便一旦连接失效,排队的操作应始终收到现在无效的RxBleConnection
,而不是重新建立新连接。重试逻辑仍然执行但在这些情况下立即失败 - 还有其他原因导致操作失败,这与连接无关。
要产生此行为,我会在PublishSubject
之后直接撰写Observable<RxBleConnection>
。该主题只是委托原始的RxBleConnection
---见下面的代码。如果连接达到错误状态,则后续订阅主题将收到错误;否则,返回共享连接。这正是我想要的行为,它似乎在发生错误时按设计工作;但是,当一切都成功时,我现在遇到了问题。
在更改之前,一旦队列中的所有操作都被使用,连接就会自动释放。但是,通过添加PublishSubject
,操作成功,但连接仍然保持打开状态。使用调试语句,我确认从未调用主题onUnsubscribe
和onTerminate
。最初的RxBleConnection
最终会超时---并且onUnsubscribe
和onTerminate
会被调用。
想知道我做错了什么导致应用程序保持连接到外围设备。
private Observable.Transformer<RxBleConnection, RxBleConnection> createConnectionSubject() {
return rxBleConnectionObservable -> {
final PublishSubject<RxBleConnection> subject = PublishSubject.create();
rxBleConnectionObservable.subscribe(
subject::onNext,
subject::onError,
subject::onCompleted);
return subject;
};
}
答案 0 :(得分:0)
PublishSubject
未将unsubscription事件传递给上游。
也许您应该查看ConnectionSharingAdapter
课程?