抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

关于 suspendCoroutine 使用场景的一点新尝试

在之前的一些文章里,我一直说 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条评论

发表评论