【问题标题】:Android LiveData Observer alternative with respect to performanceAndroid LiveData Observer 在性能方面的替代方案
【发布时间】:2020-02-19 23:51:30
【问题描述】:

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

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)

    }

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

【问题讨论】:

  • 我会在应用程序运行时直接更新图形,而不会绕道 Room,并且仅在应用程序重新启动时使用数据库来初始化图形。

标签: android kotlin android-room android-livedata


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的意见,这绝对为我解决了一些问题!我将研究 RxJava!
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2011-12-07
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多