Android LiveData Observer 性能方面的替代方案

Android LiveData Observer alternative with respect to performance

我目前正在开发一个应用程序,除其他外,它能够记录智能手机传感器,如加速度等,并在 GraphView 库的帮助下绘制它们。目前,我将传感器值读取到 Room SQLite 数据库中,然后使用观察者在 LiveData 对象的帮助下观察 table,我正在获取新测量值并将最后一个新测量值添加到图中的系列.这就是我更新图表的方式:

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)

    }

然而,我的问题是,Observer 不会对每个添加的测量值做出反应,因此当我将最后一个测量值添加到系列中时,我会跳过值。我当然可以编写代码来检查每次 Observer 对 LiveData 更改做出反应时必须添加多少值,但就我的性能而言,这似乎不是一个好的选择。有没有人知道如何将数据库中的测量值与 GraphViews 系列同步?

LiveData 不是流。它旨在代表一种自给自足的状态;它应该用于您建立状态的一系列独立事件。当你按预期使用它时,你不应该担心跳过状态,因为你只关心当前状态。

您似乎追求的是反应流。如果您使用 Room,您可以尝试 RxJava 并将您的测量事件表示为 Flowable 流。这将使您完全控制背压(您可以明确表示是要跳过事件还是缓冲事件等)。 Room 有一个 built-in support 用于 Rx 可观察查询。

另一种方法是使用始终提供完整数据集的 LiveData,但我不确定这是否会满足您的限制。