以下代码来自project。
1:在我看来,应该在另一个悬浮乐趣或viewModelScope.launch{ }
,withContext{ }
...中启动一个悬浮乐趣,filterItems()
只是一个正常函数,我不知道为什么filterItems()
需要在函数viewModelScope.launch{ }
中包装filterTasks()
,你告诉我 ?
2:在filterTasks()
函数中,viewModelScope.launch{ }
将在协程中启动,它是异步的,我认为return result
可能在从result
获得viewModelScope.launch{}
之前启动,所以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/