You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

viewModelScope.launch中执行网络请求是否会引发主线程ANR或UI卡顿?

技术问答:viewModelScope.launch中执行Retrofit请求是否会引发ANR或UI卡顿?

背景说明

根据Android开发者文档,viewModelScope.launch会在UI线程创建新协程,示例代码如下:

class LoginViewModel(
private val loginRepository: LoginRepository
): ViewModel() {

fun login(username: String, token: String) {

    // Create a new coroutine on the UI thread
    viewModelScope.launch {
        val jsonBody = "{ username: \"$username\", token: \"$token\"}"

        // Make the network call and suspend execution until it finishes
        val result = loginRepository.makeLoginRequest(jsonBody)

        // Display result of the network request to the user
        when (result) {
            is Result.Success<LoginResponse> -> // Happy path
            else -> // Show error in UI
        }
    }
}
}

问题

若在viewModelScope.launch中执行Retrofit这类网络请求,是否会引发主线程ANR问题或导致UI界面卡顿?

答案

不会引发ANR或UI卡顿,核心原因如下:

  • Retrofit挂起函数的非阻塞特性:Retrofit的网络请求方法如果被定义为挂起函数(用suspend修饰),内部会自动将网络请求逻辑切换到后台线程(依赖OkHttp的线程池)执行。当协程调用这类挂起函数时,会主动挂起当前协程,释放主线程去处理UI事件、用户交互等任务,不会占用主线程资源造成阻塞。
  • 协程的恢复机制:当网络请求完成后,协程会自动在viewModelScope默认的主线程(Dispatchers.Main)恢复执行,此时处理的是结果解析、UI更新等轻量逻辑,不会对主线程造成负担。

简单来说,viewModelScope.launch只是在主线程启动协程,但实际的网络请求工作是在后台完成的,主线程全程没有被阻塞,自然不会出现ANR或UI卡顿的问题。

内容的提问来源于stack exchange,提问作者amodkanthe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:55:13