问题描述
对于我的初始扫描,连接和授权,我有相当长的Rx操作链。这是代码。
fun startScanning() {
getScanObservable()
.take(1)
.map { scanResult ->
rxBleDevice = scanResult.bleDevice
observeDeviceState()
scanResult.bleDevice.establishConnection(false)
}
.flatMap { it }
.map { bleConnection ->
rxBleConnection = bleConnection
bleConnection.discoverServices()
}
.flatMapSingle { it }
.map { services ->
rxBleDeviceServices = services
performAuthentication()
}
.flatMap { it }
.subscribe({
state.postValue(State.AUTHENTICATED)
setupNotifications()
},{
FirebaseCrashlytics.getInstance().recordException(it)
})
.let { disposables.add(it) }
}
因此,总而言之,代码获取第一个扫描结果并立即开始建立连接。完成后,我会发现服务,然后最终对移动客户端进行身份验证。在“链”的末尾(在订阅回调中),我设置了所有需要的特征通知,然后将Disposable
保存到我的CompositeDisposable
变量中,该变量还包括我所有的Disposables从订阅到特征通知。
当我致电disposables.dispose()
时,实际上客户端确实断开了连接。我知道这是因为外围设备显示为断开连接状态,并且RxBleDevice
也显示为Disconnected
状态。
问题是,如果我再次调用startScanning
方法,什么也不会发生。永远不会调用第一个map
操作,也不会调用任何订阅方法。仅当我重新启动活动(从头重新实例化所有内容)时,该功能才起作用。
这里还有getScanObservable()
代码:
private fun getScanObservable(): Observable<ScanResult> {
val scanSettings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
.build()
val scanFilter = ScanFilter.Builder()
.setDeviceName(token.deviceUid)
.build()
return rxBleClient.scanBleDevices(scanSettings,scanFilter)
}
这是我的处置方式:
private val disposables = CompositeDisposable()
fun cleanup() {
if (!disposables.isDisposed) {
disposables.dispose()
rxBleDevice = null
rxBleDeviceServices = null
rxBleConnection = null
}
}
每当我想关闭连接并准备重新扫描并重新连接设备时,我都会调用cleanup()
方法。这就是为什么我还要销毁所有RxAndroidBle引用并仅保留RxBleClient引用的原因。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)