我有一个 View 模型,它将字节数组处理为稍微复杂的 float 组。数据的一部分是时间戳,我将其设置为 LiveData 类型,观察者监听时间戳的变化。当发生更改时,它会获取新的时间戳并获取 float 组。
我的问题是,当在 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 值
mTime.postValue(time)
另外,作者:Tenfour04 comment
postValue
will result in the observers being called after this function returns.setValue
results in the observers being called beforesetValue
returns, so before the rest of the code in this function.
关于android - 观察者何时需要实时数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61535773/