以下代码来自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/

10-15 23:54