【发布时间】:2023-03-22 10:12:02
【问题描述】:
我有时注意到,当我将 Kotlin 协程“启动”嵌套在另一个“启动”中时,它并不总是会触发。
例如,我有这个代码:
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()
}
}
}
现在我一直在调试,我在SendRequestHelper类的requestFriend方法中放置了一个断点。而且断点永远不会命中。
即使它已经超过了那个代码,因为我的第二个 AlertDialog 显示得很好。
这是怎么回事?
我不应该嵌套launch 语句吗?是什么阻止了它的工作?
谢谢
【问题讨论】:
-
确保您的嵌套启动具有主启动的范围。
-
而不是启动
withContext(Dispatchers.Main)来显示对话框..您可以直接显示对话框..(在这种情况下不需要嵌套)还检查是否调试中断显示 刻度线 .. 否则您可以添加日志和测试 -
@SantanuSur 如果我不使用
Dispatchers.Main上下文,Android 框架会说我不在创建视图的主线程上? -
@user8159708 看来你已经在
main thread..你能为askToAddFriend()提供launch函数吗
标签: android kotlin kotlin-coroutines