如何延迟加载微调器并在协程内有条件地启动它?
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)
}
}
}
我目前有一个可行的方法,但它使用协程外部的布尔值,感觉必须有更优雅的方法来实现它。我计划在我的应用程序的许多地方使用这种模式,所以我希望它是 "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)
}
}
}