gpt4 book ai didi

kotlin - 为什么一个普通函数需要用 viewModelScope.launch 包装?

转载 作者:行者123 更新时间:2023-12-02 12:34:22 25 4
gpt4 key购买 nike

以下代码来自project .

1:在我看来,一个挂起乐趣应该在另一个挂起乐趣或 viewModelScope.launch{ }, withContext{ } ... , 中启动filterItems() 只是一个普通的函数,不知道为什么 filterItems() 需要在函数 viewModelScope.launch{ } 包裹 filterTasks(),你能告诉我吗?

2: 在函数filterTasks()中,viewModelScope.launch{ }会在协程中启动,它是异步的,我认为返回结果可能在我从 viewModelScope.launch{} 获得 result 之前启动,所以 result 可能为 null,代码是否正确?

代码

   private fun filterTasks(tasksResult: Result<List<Task>>): LiveData<List<Task>> {       
val result = MutableLiveData<List<Task>>()

if (tasksResult is Success) {
isDataLoadingError.value = false
viewModelScope.launch {
result.value = filterItems(tasksResult.data, getSavedFilterType())
//return filterItems(tasksResult.data, getSavedFilterType()) //It will cause error.
}
} else {
result.value = emptyList()
showSnackbarMessage(R.string.loading_tasks_error)
isDataLoadingError.value = true
}

return result //I think it maybe be launched before I get the result from viewModelScope.launch{}
}


private fun filterItems(tasks: List<Task>, filteringType: TasksFilterType): List<Task> {
val tasksToShow = ArrayList<Task>()
// We filter the tasks based on the requestType
for (task in tasks) {
when (filteringType) {
ALL_TASKS -> tasksToShow.add(task)
ACTIVE_TASKS -> if (task.isActive) {
tasksToShow.add(task)
}
COMPLETED_TASKS -> if (task.isCompleted) {
tasksToShow.add(task)
}
}
}
return tasksToShow
}

最佳答案

它不会,除非它执行一些繁重的工作并且您希望将它移动到后台线程,这里就是这种情况。这里作者只是想打散工作,以便可以先用空列表更新实时数据,然后再更新过滤后的列表(获取计算量大),但忘了在主线程之外进行。

在这种特殊情况下,作者可能忘记添加后台调度程序作为参数

viewModelScope.launch(Dispatchers.Default)

因此,在这种情况下,预期的行为没有实现,因此您会看到这个“荒谬的”协程。

我认为你可以通过修复为项目做出贡献:)

关于kotlin - 为什么一个普通函数需要用 viewModelScope.launch 包装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63788552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com