官方介绍:
在高阶函数中使用协程
1. 原始代码
// MainViewModel.kt
fun refreshTitle() {
viewModelScope.launch {
try {
_spinner.value = true
// this is the only part that changes between sources
repository.refreshTitle()
} catch (error: TitleRefreshError) {
_snackBar.value = error.message
} finally {
_spinner.value = false
}
}
}
分析:
(1) refreshTitle 里, 除了 repository.refreshTitle() 是真正数据加载的操作,
其余的是 显示 加载图标 和 错误的样板代码.
2. 在高阶函数中使用协程
新增 高阶函数 launchDataLoad
\\MainViewModel.kt
private fun launchDataLoad(block: suspend () -> Unit): Job {
return viewModelScope.launch {
try {
_spinner.value = true
block()
} catch (error: TitleRefreshError) {
_snackBar.value = error.message
} finally {
_spinner.value = false
}
}
}
重构 refreshTitle() 以使用新函数.
// MainViewModel.kt
fun refreshTitle() {
launchDataLoad {
repository.refreshTitle() // 实际加载数据
}
}
分析:
(1) 将显示加载图标 和显示错误的逻辑,抽取出来
(2) 简化了实际 加载数据 的代码.
(3) launchDataLoad 接受 的参数block, 是一个suspend 的lambda 表达式.
block: suspend () -> Unit
网友评论