【问题标题】:android.view.WindowManager$BadTokenException crash in Handler.Callback activity variable [duplicate]Handler.Callback 活动变量中的 android.view.WindowManager$BadTokenException 崩溃 [重复]
【发布时间】:2020-06-12 09:19:11
【问题描述】:

我的活动中有这个 Handler 变量需要传递给第三方类。

private val handler =
        Handler(Handler.Callback { msg ->
            when (msg.what) {
                MESSAGE_READ -> {
                    val readBuf = msg.obj as ByteArray
                    val readMessage = String(readBuf, 0, msg.arg1)
                    val builder = AlertDialog.Builder(this)
                    builder.setMessage("Are you sure you want to pay $readMessage?")
                    builder.setPositiveButton("YES") { dialog, which ->
                        doCardTransaction(readMessage)
                        dialog.cancel()
                    }.setNegativeButton("NO") {
                            dialog, which -> dialog.dismiss()
                    }
                    builder.show()
                }
            }
            false
        })

当我在第一次启动应用程序时收到回调时,我能够看到对话框,但是当我取消应用程序时,再次打开它。我得到了崩溃

android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 android.os.BinderProxy@fa03400 无效;是你的活动 跑步吗?

尽管我可以在崩溃前正常与活动交互。

我已经在尝试像这样在 onDestroy 中删除处理程序的回调和消息

override fun onDestroy() {
    super.onDestroy()

    handler.removeCallbacksAndMessages(null)

    chatController?.stop()
}

什么可能是错的,我该怎么办?

【问题讨论】:

    标签: android


    【解决方案1】:

    应该使用runOnUiThread {...runnable...} 来显示对话框,因为您的对话框位于Handler。那可能不是 UiThread。

    【讨论】:

    • 我也试过了,对我也不起作用。我无法弄清楚的主要问题是活动的 isFinishing 甚至在它到达崩溃现场之前也是真的。
    猜你喜欢
    • 2016-11-26
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多