【问题标题】:When is the observer called for live data?什么时候需要观察者获取实时数据?
【发布时间】:2020-08-15 13:07:30
【问题描述】:

我有一个视图模型,可以将字节数组处理成稍微复杂的浮点数组。部分数据是我设置为 LiveData 类型的时间戳,观察者监听时间戳的变化。当发生更改时,它会获取新的时间戳并获取浮点数组。

我的问题是,当 LiveData 对象中设置“值”时,观察者是立即调用还是等待周围函数完成?换句话说,我是否应该确保在设置“值”之前更新观察者正在访问的任何其他数据?

另外,这是否滥用了 LiveData 机制(将其用作数据发生较大变化的标志)?

  val mTime = MutableLiveData<Double>()
  var mStateDataSet = ArrayList<ArrayList<Float>>()

  fun updateData(rawData: ByteArray) {

    val buffer = ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN)

    val min = (buffer.getInt(4)).toDouble()
    val usec = (buffer.getInt(8)).toDouble()

    val time: Double = min * 60.0 + usec * (1.0 / 1e6)

    // Update the live data....
    mTime.value = time

    // This data is used by the observer of "mTime"
    mStateDataSet[KEY_VOLTAGES] = getSubDataFloat(buffer, NUM_VOLTAGE);
    mStateDataSet[KEY_PRESSURES] = getSubDataFloat(buffer, NUM_PRESSURE);
    mStateDataSet[KEY_LEFT_ANGLES] = getSubDataFloat(buffer, NUM_LEFT_ANGLES);
    mStateDataSet[KEY_RIGHT_ANGLES] = getSubDataFloat(buffer, NUM_RIGHT_ANGLES);
    mStateDataSet[KEY_LEFT_ACCEL] = getSubDataFloat(buffer, NUM_LEFT_ACCEL);
    mStateDataSet[KEY_RIGHT_ACCEL] = getSubDataFloat(buffer, NUM_RIGHT_ACCEL);
    mStateDataSet[KEY_DEBUG] = getSubDataFloat(buffer, NUM_DEBUG);

  }

// Example observer from one of my fragments
    val timeObserver = Observer<Double> { newTime ->
      addDataPoint(mSharedStateDataViewModel.mStateDataSet, newTime)
    }
    mSharedStateDataViewModel.mTime.observe(viewLifecycleOwner, timeObserver)

【问题讨论】:

  • 您以错误的方式更新 LiveData。使用.postValue()
  • 你能详细说明为什么 postValue 比 setValue 更合适吗?
  • 这是一个关于差异的 Stack Overflow 问题(和答案):stackoverflow.com/questions/51299641/…
  • 我看到了,但我找不到与实际调用观察者的时间相关的答案。就我而言,这一切都发生在主线程中(一个调用“updateData”函数的活动,带有附加观察者的任何片段。我相信 setValue 更适合我的应用程序。
  • @kkemper... 我以为您是在后台线程上执行所有这些操作的。如果您在主线程上执行这些操作,请使用.setValue()。否则,请使用.postValue()

标签: android kotlin android-livedata


【解决方案1】:

您应该使用

更新 livedata 值
mTime.postValue(time)

另外,Tenfour04 comment

postValue 将导致在此函数返回后调用观察者。 setValue 导致在 setValue 返回之前调用观察者,因此在此函数中的其余代码之前。

【讨论】:

  • 我在示例中省略了观察者的设置。我会补充一点以更清楚。您能否详细说明为什么在这种情况下 postValue 比 setValue 更好?
  • postValue 将导致在此函数返回后调用观察者。 setValue 导致在 setValue 返回之前调用观察者,因此在此函数中的其余代码之前。
  • 将该评论添加到您的答案中,我会检查它作为答案!
【解决方案2】:

鉴于观察者的LifeCycleOwner(即Activity,Fragment)的状态至少为STARTED,并且您使用setValuemethodObserver 将立即得到通知。

在您的情况下,当您执行mTime.value = time 时,这将立即通知相关联的Observer,请注意,如果您在同一个LiveData object 上有多个观察者,则可能需要一些时间来通知所有并且在向两个不同的观察者的通知之间可能会有很大的延迟。

如果您在示例中使用postValue,则在封闭方法完成后将通知Observer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多