首页 > 解决方案 > 如何使用 rxBleGattCallback.setNativeCallback(bluetoothGattCallback)?

问题描述

我有一个 rxBleConnection,我正在尝试将本机 BluetoothGattCallback 设置为 rxBleGattCallback 但它不起作用,因为我的 BluetoothGattCallback 没有检测到任何事件。我的代码是下一个,有人可以帮助我吗?

class MyRxBleCustomOperation: RxBleCustomOperation<Any> {

    override fun asObservable(bluetoothGatt: BluetoothGatt?, rxBleGattCallback: RxBleGattCallback?,
                              scheduler: Scheduler?): Observable<Any> {
        rxBleGattCallback?.setNativeCallback(bluetoothGattCallback)
        return Observable.just("")
    }

    private val bluetoothGattCallback = object : BluetoothGattCallback() {
        override fun onCharacteristicChanged(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?) {
            super.onCharacteristicChanged(gatt, characteristic)
            Timber.e("SOME CHARACTERISTIC CHANGED") //Here It doesn't detect nothing
        }
    }
}

.............我从某个班级打来电话......

rxBleConnection.queue(myRxBleCustomOperation()).subscribe()

我希望检测到所有 onCharacteristicChanged 因为我必须连接所有收到的数据

标签: rx-javarx-java2rxandroidble

解决方案


来自的Javadoc RxBleGattCallback.setNativeCallback()

操作终止后回调引用会自动释放。

您将Observable.just("")在订阅后立即返回完成(终止)。这就是为什么您没有收到任何回调的原因,因为您的回调几乎立即被分离。

如果您需要连接从所有活动通知接收到的所有数据,您可以通过合并它们轻松完成:

val allNotificationsObs: Observable<ByteArray> =
    Observable.merge( // still need to activate all wanted notifications
        rxBleConnection.setupNotification(uuid0),
        rxBleConnection.setupNotification(uuid1),
        rxBleConnection.setupNotification(uuid2),
        rxBleConnection.setupNotification(uuid3),
        rxBleConnection.setupNotification(uuid4)
        // ...
    )
        .flatMap { it }

推荐阅读