在之前的一些文章里,我一直说 suspendCoroutine
一般用来衔接 Java 层的一些接口回调,不能说说错了,但是范围太小了,直到这周做了文件管理后,有了一点新的看法。
背景需求
用户选了一堆文件,复制后,在进行粘贴时,如果有同名的会有一个弹窗选择:重命名、替换、取消。
那么选择弹窗弹起时,整个操作应该是阻塞的,那么怎么用一个简单直观的代码逻辑去做这件事呢?
代码实现
这是一个需要阻塞的场景,代码需要等待用户进行选择,这时 suspendCoroutine
就登场了。
一段伪代码:
fun doOperate() {
lifecycleScope.launch {
val datas = clipboardViewModel.getDatas()
datas.forEach { file ->
if (clipboardViewModel.isFileConflict(file)) {
when (showDialog()) {
FileConflictOperate.RENAME -> {
clipboardViewModel.addToRenameList(file)
}
FileConflictOperate.REPLACE -> {
clipboardViewModel.addToReplaceList(file)
}
FileConflictOperate.CANCEL -> {
clipboardViewModel.addToCancelList(file)
}
}
}
}
clipboardViewModel.doOperate()
}
}
private suspend fun showDialog(): FileConflictOperate {
return suspendCoroutine { sc ->
UserOperateDialog().apply {
onReplace = {
sc.resume(FileConflictOperate.REPLACE)
}
onRename = {
sc.resume(FileConflictOperate.RENAME)
}
onCancel = {
sc.resume(FileConflictOperate.CANCEL)
}
}.show()
}
}
enum class FileConflictOperate {
RENAME, REPLACE, CANCEL
}
相信已经看得很清楚了,其他代码就不展示了,其实我也只是秉承着 UI 应该做 UI 的事,数据层就应该做数据层的事,同时少写回调,简化逻辑的观念,没想到还真让我找到了一个相对可观的处理办法。
协程确实是一个好东西~ 真香~ 如果还有更优处理办法,还请大佬们赐教,不尽感激。
本站由以下主机服务商提供服务支持:
0条评论