我目前正在开发一个应用程序,除其他功能外,该应用程序能够记录智能手机的传感器(如加速度等),并借助GraphView库对其进行绘制。目前,我将传感器值读取到Room SQLite数据库中,然后使用观察者在LiveData对象的帮助下观察该表,从而获得了新的度量并将最新的度量添加到Graph中的序列中。这就是我更新图表的方式:
sharedViewModel.allAccelerations.observe(viewLifecycleOwner, Observer<List<MeasurementDatabaseHelper.Measurement>> { measurements ->
if (sharedViewModel.isReset.value == true && measurements.isNotEmpty()) {
val time = (measurements.last().time.toDouble() - measurements.first().time.toDouble())*1e-9
val accX = measurements.last().accX.toDouble()
series.appendData(DataPoint(time, accX), true, 50)
}
然而,我的问题是观察者不会对每个添加的测量值做出反应,因此当我将最后一个测量值添加到系列时,IM会跳过这些值。我当然可以编写代码来检查每次观察者对LiveData更改做出反应时必须添加多少个值,但是就我个人而言,这似乎不是一个好选择。是否有人有更好的主意如何将数据库中的测量与GraphViews系列进行同步?
LiveData是不是流。它旨在代表一种自给自足的状态;它应该not用于建立状态所依据的一系列独立事件。当您按预期使用它时,不必担心跳过状态,因为您只关心当前状态。
您似乎追求的是反应性的流程。如果使用Room,则可以尝试RxJava并将测量事件表示为Flowable
流。这样可以完全控制背压(您可以明确表示是否要跳过事件或缓冲事件等)。房间有一个built-in support,用于接收Rx的查询。
另一种方法是使用始终提供完整数据集的LiveData,但我不确定这是否满足您的限制。