gpt4 book ai didi

kotlin - 调用 Continuation.resumeX() 失败一定是个问题吗?

转载 作者:行者123 更新时间:2023-12-02 12:32:47 25 4
gpt4 key购买 nike

我正在使用 suspendCoroutine 来避免在 Dialog 中使用回调。但是,在 Android Dialog 中,没有明显的地方可以在关闭对话框(通过在对话框区域外单击)时调用 Continuation.resume()。如果您尝试在 Dialog.setOnDismissListener() 中调用,那么您必须跟踪是否已在按钮监听器中调用了 resume。

suspend fun displayDialog() = suspendCoroutine<String?> { continuation ->
val builder = AlertDialog.Builder(context)
builder.setCancelable(true)
builder.setNegativeButton(android.R.string.cancel) { _, _ ->
continuation.resume(null)
}
builder.setPositiveButton(android.R.string.ok) { _, _ ->
continuation.resume("it's ok")
}
val dialog = builder.show()
dialog.setOnDismissListener {
// if the user clicked on OK, then resume has already been called
// and we get an IllegalStateException
continuation.resume(null)
}
}

因此,最好跟踪是否已调用 resume(以避免再次调用它),还是不要理会 resume(null) 调用(在 onDismissListener 中) )?

最佳答案

Continuation 是一个低级原语,应该只恢复一次,所以你必须在使用它时跟踪 resume 是否已经被调用。或者,您可以使用更高级别的通信原语,例如 CompletableDeferred , 多用途 complete功能:

suspend fun displayDialog(): String? {
val deferred = CompletableDeferred<String?>()
val builder = AlertDialog.Builder(context)
builder.setCancelable(true)
builder.setNegativeButton(android.R.string.cancel) { _, _ ->
deferred.complete(null)
}
builder.setPositiveButton(android.R.string.ok) { _, _ ->
deferred.complete("it's ok")
}
val dialog = builder.show()
dialog.setOnDismissListener {
deferred.complete(null)
}
return deferred.await()
}

关于kotlin - 调用 Continuation.resumeX() 失败一定是个问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55323411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com