【问题标题】:Kotlin Nested Coroutine Launches not triggering?Kotlin嵌套协程启动未触发?
【发布时间】: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


【解决方案1】:

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

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

由于此代码在 Positive Button Click 上运行,因此您必须定义实际的操作范围。 launch 函数简单触发并忘记所以在 Button Click 函数中你并不简单地缓存范围(这是我的假设)

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

更多关于你可以找到here

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

更多是here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2020-07-15
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多