0

问题

我正在尝试使用 a 和 a 实现一个简单的“日志”TextView视图。StringViewModel

我想到的想法是简单地将文本连接到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")
        }
    }
}

postValue 结果的屏幕截图

使用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"
            }
        }
    }
}

setValue 结果的屏幕截图


编辑:添加图片。

4

0 回答 0