gpt4 book ai didi

android - 为什么viewModelScope.launch默认运行在主线程上

转载 作者:行者123 更新时间:2023-12-03 12:43:42 30 4
gpt4 key购买 nike

当我在学习协程以及如何在 Android 应用程序中正确使用它们时,我发现了一些令我惊讶的事情。

使用 viewModelScope.launch { } 启动协程时并在启动 lambda 中设置断点,我注意到我的应用程序不再响应,因为它仍在主线程上。

这让我很困惑,因为 viewModelScope.launch { } 的文档明确说明:

Launches a new coroutine without blocking the current thread



当前线程不是主线程吗?如果默认情况下它不在不同的线程上运行,那么启动的全部目的是什么?

我能够使用 viewModelScope.launch(Dispatchers.IO){ } 在另一个线程上运行它正如我所期望的那样工作,即在另一个线程上。

我想从 launch 中完成什么方法是调用存储库并做一些 IO 工作,即调用 Web 服务并将数据存储在房间数据库中。所以我想调用 viewModelScope.launch(Dispatchers.IO){ }在不同的线程上完成所有工作,最后更新 LiveData 结果。
viewModelScope.launch(Dispatchers.IO){
liveData.postValue(someRepository.someWork())
}

所以我的第二个问题是,这是要走的路吗?

最佳答案

ViewModelScope.launch { }在主线程上运行,但也为您提供了运行其他调度程序的选项,因此您可以让 UI 和后台操作同步运行。
以你为例:

fun thisWillRunOnMainThread() {

viewModelScope.launch {

//below code will run on UI thread.
showLoadingOnUI()

//using withContext() you can run a block of code on different dispatcher
val result = novel.id = withContext(Dispatchers.IO) {
withsomeRepository.someWork()
}

//The below code waits until the above block is executed and the result is set.
liveData.value = result
finishLoadingOnUI()
}
}
为了获得更多引用,我想说有一些简洁的文章可以帮助您理解这个概念。
Medium link that explains it really neat.

关于android - 为什么viewModelScope.launch默认运行在主线程上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62166878/

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