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

Jetpack Compose CircularProgressIndicator加载状态下真机不旋转问题

解决CircularProgressIndicator真机不转动的问题

核心原因

你的apiService.postData是同步阻塞的网络请求,而viewModelScope.launch默认在主线程执行,这会导致主线程被网络请求占用,无法处理UI动画帧。模拟器的线程调度相对宽松,所以动画能正常运行,但真机对主线程阻塞更敏感,直接导致进度条停止转动。

修复方案

将网络请求切换到IO线程执行,避免阻塞主线程:

修改ViewModel中的postData函数:

private val _uiState = MutableStateFlow<HomeUIState>(HomeUIState.Loading)
val uiState: StateFlow<HomeUIState> = _uiState

fun postData(data: String){
    viewModelScope.launch {
        // 发起请求前重置为Loading状态(适配用户触发操作时的加载场景)
        _uiState.value = HomeUIState.Loading
        
        // 切换到IO线程执行网络请求,释放主线程处理UI动画
        val result = withContext(Dispatchers.IO) {
            apiService.postData(data = data)
        }

        when(result) {
            is NetworkResponse.Success -> {
                Log.d("DataViewModel", "postData: Success")
                _uiState.value = HomeUIState.Success
            }
            is NetworkResponse.Failure -> {
                Log.d("DataViewModel", "postData: Failure")
                _uiState.value = HomeUIState.Error(errorMessage = result.error.toString(), showError = true)
            }
        }
    }
}

sealed interface HomeUIState {
    data object Success : HomeUIState
    data class Error(val errorMessage: String, val showError: Boolean = false) : HomeUIState
    data object Loading : HomeUIState
}

额外检查点

  • 确认UI层中CircularProgressIndicator没有被布局属性强制固定(比如错误的Modifier设置),导致动画无法渲染
  • 确保uiState在Compose中通过collectAsState()正确观察,状态更新能同步到UI

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:51:11