【发布时间】: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