尝试在 Jetpack Compose 中实现传感器数据的实时图表,但我正在努力寻找将传感器数据传递到图表的正确方法。
该应用程序在 Kotlin 类中每 40 毫秒通过 BLE 接收新的传感器数据,我想将这些数据传递到自定义 Compose 折线图。我尝试使用 Stateflow 来实现它,然后将其收集在可组合项中以填充列表,但这太慢了:
数据接收器:
private val _liveData = MutableStateFlow(0)
// The UI collects from this StateFlow to get its state updates
val liveData: StateFlow<Int> = _liveData
override fun onCharacteristicChanged(
characteristic: BluetoothGattCharacteristic,
value: ByteArray,
) {
_liveData.value = value[0].toInt()
}
这部分工作正常,数据设置为 liveData 值。 但是当我尝试从可组合项中收集它时,例如:
LaunchedEffect(DataReceiver.liveData) {
DataReceiver.liveData
.collect {
Log.d("BLE", "Value: " + it.value.toString())
}
}
我缺少一些值,比如这样的速度不够快,无法捕获流中的所有数据?
我该如何改进这一点,或者从事件接收这些值并将其添加到可组合项的列表中的最佳方式是什么?
根据@Leviathan的建议,我想出了这个解决方案,以防有人寻找类似的东西:
override fun dataFlow() = callbackFlow<ByteArray> {
val characteristicChangedListener = object: ICharacteristicChangedListener {
override fun onCharacteristicChanged(
deviceAddress: String,
characteristic: BluetoothGattCharacteristic,
value: ByteArray
) {
val uuid = characteristic.uuid.toString().uppercase()
trySend(it)
}
}
AndroidBLEDeviceHandler.registerCharacteristicChangedListener(characteristicChangedListener);
awaitClose {
AndroidBLEDeviceHandler.unregisterCharacteristicChangedListener(characteristicChangedListener);
}
}
然后,我为我的图形可组合项创建了一个视图模型,并在那里收集流程并将数据放入列表中:
dataList = mutableListOf()
...
streamEMGJob = viewModelScope.launch {
chartDataManager.dataFlow().collect {
//Process the data
dataList.add(it)
}
}
不确定这是否是最好的解决方案,但它运行速度足够快并且不会丢失任何数据点