我在使用 AlertDialog 时遇到问题:如果我想在打开一个新活动后完成当前活动,我会因以下错误而崩溃:
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 评论上完成我的活动,就会弹出错误。如果我删除该行,则不会显示任何错误,但这会导致问题,因为我可以返回到之前的活动,但我不希望那样。我已经尝试在
dialogInterface.dismiss()
lambda 方法上使用 setPositiveButton
,但没有成功。有什么想法吗?
编辑!解决了!:)
我重写了 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 的提示。
在完成活动之前尝试关闭您的警报对话框。
你的AlertDialog.dimiss();
Dialog
Window
是使用活动 Context
创建的。 Activity
必须清理它拥有的窗口。您应该先销毁对话,然后再销毁活动。或者使用DialogFragment
.
您提到的日志告诉您无法正确销毁活动(正如您使用
finish()
所要求的那样),因为对话仍然引用它。
这样也能解决问题
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);