问题
我正在尝试使用 a 和 a 实现一个简单的“日志”TextView
视图。String
ViewModel
我想到的想法是简单地将文本连接到LiveData<String>
using setValue()
,但我需要应用程序在不阻塞 UI 的情况下工作。所以我把代码放在协程里面,但是setValue()
只能从主线程调用。我试过了postValue()
,但如果快速调用它不会添加文本。
我想出了一个解决方案:使用withContext(Dispatchers.Main)
,但我认为这很hacky,而不是要走的路。
有没有另一种方式来写这个“更好”?
目标
“a” + “b” + “c” = “abc”
使用postValue()
结果:“a”+“b”+“c”=“ac”
从屏幕截图中可以看出,它缺少一些周期。
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
init {
viewModelScope.launch {
_data.value = "Example data"
}
}
fun longTask() {
viewModelScope.launch(Dispatchers.Default) {
// Long task running in the background
for (i in 0..200000) {
// Need to use postValue() because setValue() cannot be called from here
_data.postValue("${_data.value} - $i")
}
}
}
使用setValue()
结果:“a”+“b”+“c”=“abc”
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
init {
viewModelScope.launch {
_data.value = "Example data"
}
}
fun longTask() {
viewModelScope.launch(Dispatchers.Default) {
// Long task running in the background
for (i in 0..200000) {
withContext(Dispatchers.Main) {
_data.value = "${_data.value} - $i"
}
}
}
}
编辑:添加图片。