android 在AlertDialog操作引发错误后完成当前活动

3vpjnl9f  于 2023-04-18  发布在  Android
关注(0)|答案(3)|浏览(129)

我在AlertDialog中遇到了问题:如果我想在打开一个新Activity后完成当前Activity,我会崩溃并出现以下错误:
E/WindowManager: android.view.WindowLeaked: Activity com.myapp.ShowsActivity has leaked window DecorView@2435213[ShowsActivity] that was originally added here
当我想注销一个用户时,就会发生这种情况。AuthLogic.logout()方法被调用(我将其导出到一个独立的类中,以获得更可读的代码),这会触发一个“你确定吗?”警报对话框,然后重定向到登录活动。注销按钮逻辑:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_shows)

        // some code . . .

        btnLogout.setOnClickListener {
            AuthLogic.logout(this)
            finish() // *1
    }
}

AuthLogic.logout():

fun logout(context: Context) {
        val builder = AlertDialog.Builder(context)
        builder.setTitle(R.string.are_you_sure)
        builder.setMessage(R.string.confirm_msg_logout)
        builder.setPositiveButton(R.string.confirm) { dialogInterface: DialogInterface, i: Int ->
                // aditional logout logic
                context.startActivity(AuthActivity.newStartIntent(context))
            }
            builder.setNegativeButton(R.string.cancel) { di: DialogInterface, _: Int -> }
            builder.show()
        }

我注意到,如果我在 *1注解上完成活动,会弹出错误。如果我删除该行,不会显示错误,但这会导致一个问题,因为我可以返回到上一个活动,而我不希望这样。我已经尝试在setPositiveButton lambda方法上使用dialogInterface.dismiss(),但没有成功。有什么想法吗?

编辑!已解决!:)

我重写了AuthLogic.logout():

fun logout(context: Context) {
            val builder = AlertDialog.Builder(context)
            builder.setTitle(R.string.are_you_sure)
            builder.setMessage(R.string.confirm_msg_logout)
            builder.setPositiveButton(R.string.confirm) { dialogInterface: DialogInterface, i: Int ->

                // logout logic ...
                dialogInterface.dismiss()
                context.startActivity(AuthActivity.newStartIntent(context))
                (context as Activity).finish()
            }
            builder.setNegativeButton(R.string.cancel) { di: DialogInterface, _: Int -> }
            builder.show()
        }

并删除了 *1上的finish()线。感谢@Johan Kovalski的提示。

whlutmcx

whlutmcx1#

尝试在完成练习之前关闭提醒对话框。
. println();

im9ewurl

im9ewurl2#

对话框Window是用活动Context创建的。Activity必须清理它拥有的窗口。你应该先销毁对话框,然后销毁活动。或者使用DialogFragment
你在问题中提到的日志告诉你Activity不能被正确地销毁(正如你用finish()请求的那样),因为对话框仍然保存着对它的引用。

n1bvdmb6

n1bvdmb63#

这样也能解决问题

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
   intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

相关问题