观察员什么时候需要实时数据?

时间:2020-05-01 02:09:09

标签: android kotlin android-livedata

我有一个视图模型,该模型将字节数组处理为稍微复杂的浮点数组。数据的一部分是时间戳,我已将其设置为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)

2 个答案:

答案 0 :(得分:2)

您应该使用以下方式更新实时数据值

mTime.postValue(time)

此外,通过Tenfour04 comment

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

答案 1 :(得分:0)

鉴于观察者的LifeCycleOwner(即活动,片段)的状态至少为STARTED,并且您使用setValue method,{{1} }会立即收到通知。

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

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