gpt4 book ai didi

android - Kotlin嵌套协程启动不会触发吗?

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

我注意到有时当我将Kotlin Coroutine的“发射器”嵌套在另一个“发射器”中时,它并不总是会触发。

例如,我有以下代码:

private suspend fun askToAddFriend() {
val friendExists = friendExists(userUsername)

if (!friendExists) {

withContext(Dispatchers.Main) {
AlertDialog.Builder(this@EntryActivity)
.setTitle(getString(R.string.send_friend_request))
.setMessage("${getString(R.string.would_you_like_to_add)} $userDisplayName ${getString(R.string.as_a_friend_questionmark)}")
.setPositiveButton(getString(R.string.yes)) { dialog, which ->
dialog.dismiss()

launch(Dispatchers.IO) {
SendRequestHelper(this@EntryActivity).requestFriend(userUsername, userFirestoreDocumentId)
}

AlertDialog.Builder(this@EntryActivity)
.setTitle(getString(R.string.friend_request_sent))
.setMessage("${getString(R.string.weve_sent_friend_request_to)} $userDisplayName")
.setPositiveButton(getString(R.string.ok)) { dialog2, _ ->
dialog2.dismiss()
}
.setOnDismissListener { callback.invoke() }
.create().show()
}
.setNegativeButton(getString(R.string.no)) { dialog, which ->
dialog.dismiss()
callback.invoke()
}
.create().show()
}

}
}

现在,我一直在调试,并且在 requestFriend类的 SendRequestHelper方法中放置了一个断点。而且断点永远不会命中。
即使它已经超出了该代码,因为我的第二个 AlertDialog显示的很好。

这里发生了什么?

我不应该嵌套 launch语句吗?是什么使它停止工作?

谢谢

最佳答案

那就是你现在所拥有的(不是工作代码)

dialog.dismiss()
launch(Dispatchers.IO) {
SendRequestHelper(this@EntryActivity).requestFriend(userUsername, userFirestoreDocumentId)
}

由于此代码在“肯定按钮单击”上运行,因此您必须定义操作的范围。 launch函数简单触发并忘记,因此在Button Click函数中,您不简单将范围缓存(这是我的假设)
dialog.dismiss()
GlobalScope.launch(Dispatchers.IO) {
SendRequestHelper(this@EntryActivity).requestFriend(userUsername, userFirestoreDocumentId)
}

您可以找到 here的更多琥珀色

另请注意, GlobalScope不适用于这种情况,因为它在整个应用程序生命周期内保持 Activity 状态。
您可能应该有另一个范围,例如ViewModel范围,才能在该范围内运行您的工作。

here更多

关于android - Kotlin嵌套协程启动不会触发吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57493982/

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