如何延迟加载微调器并在协程内有条件地启动它?

How can I delay a loading spinner and start it conditionally inside of a coroutine?

我目前有一个可行的方法,但它使用协程外部的布尔值,感觉必须有更优雅的方法来实现它。我计划在我的应用程序的许多地方使用这种模式,所以我希望它是 "right"。目前我是这样解决问题的:

private loadingFinished: Boolean = false
private fun loadData() {
    showLoading.value = false
    loadingFinished = false
    viewModelScope.launch {
        delay(500)
        if (!loadingFinished)
            showLoading.value = true
    }
    viewModelScope.launch {
        try {
            data = api.thisIsASuspendFunction
            updateUI.call()
            loadingFinished = true
            showLoading.value = false
        }
        catch (e: Exception){
            loadingFinished = true
            showLoading.value = false
            showError.value = errorHelper.getErrorMessageType(e)
        }
    }
}

这完全符合我现在的预期:如果 api 调用花费的时间超过半秒,则进度微调器会显示并在挂起函数完成后停止。但是有没有更正确的方法来实现呢?

您可以为它使用作业取消:

private fun loadData() {
    showLoading.value = false
    viewModelScope.launch {
        val loadingJob = launch {
            delay(500)
            showLoading.value = true
        }
        try {
            data = api.thisIsASuspendFunction
            loadingJob.cancel()
            updateUI.call()
            showLoading.value = false
        }
        catch (e: Exception){
            loadingJob.cancel()
            showLoading.value = false
            showError.value = errorHelper.getErrorMessageType(e)
        }
    }
}