You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AlertDialog跳转Activity时出现Activity窗口泄漏问题求助

解决AlertDialog导致的Activity窗口泄漏问题

你遇到的这个Activity has Leaked window错误,本质是代码里几个不合理操作导致AlertDialog和Activity的生命周期脱节了,我帮你拆解问题并给出落地的修复方案:

问题根源分析

  • 手动调用onPause():这是Android系统管控的生命周期方法,绝对不能手动调用!强行调用会打乱Activity的状态,导致AlertDialog关联的窗口无法正确和Activity解绑。
  • TimerTask的内存泄漏风险:Timer运行在后台线程,当你跳转Activity后,原Activity可能已经被销毁,但TimerTask还持有AlertDialog的引用,而AlertDialog又持有Activity的引用——不仅会造成内存泄漏,此时调用alert1.dismiss()还会因为Activity已不在活跃状态,抛出窗口泄漏错误。
  • AlertDialog的管理混乱:代码里先判断alert1是否显示再dismiss,但后面又重新创建了alert1,逻辑上存在重复管理的问题。

修复后的代码示例

我用Handler+生命周期绑定的方式重构你的代码,彻底规避上述问题:

// 定义全局的Handler和Runnable,方便在生命周期中取消任务
private Handler mDialogHandler = new Handler();
private Runnable mDismissDialogRunnable;
private AlertDialog mAlertDialog;

// 替换你原来的弹窗逻辑
private void showAutoDismissDialog() {
    // 先销毁已存在的弹窗,避免重复创建
    if (mAlertDialog != null && mAlertDialog.isShowing()) {
        mAlertDialog.dismiss();
        mAlertDialog = null;
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    // 这里补充你的弹窗配置,比如builder.setMessage("3秒后自动关闭")等
    builder.setCancelable(true);

    mAlertDialog = builder.create();
    mAlertDialog.show();

    // 用Handler实现3秒后自动关闭弹窗,再跳转Activity
    mDismissDialogRunnable = new Runnable() {
        @Override
        public void run() {
            if (mAlertDialog != null && mAlertDialog.isShowing()) {
                mAlertDialog.dismiss();
                mAlertDialog = null;
                // 弹窗完全销毁后,再执行跳转逻辑
                startActivity(new Intent(CurrentActivity.this, TargetActivity.class));
            }
        }
    };
    mDialogHandler.postDelayed(mDismissDialogRunnable, 3000);
}

// 在Activity销毁时清理所有资源,斩断引用链
@Override
protected void onDestroy() {
    super.onDestroy();
    // 取消未执行的定时任务
    if (mDialogHandler != null && mDismissDialogRunnable != null) {
        mDialogHandler.removeCallbacks(mDismissDialogRunnable);
    }
    // 销毁残留的弹窗
    if (mAlertDialog != null && mAlertDialog.isShowing()) {
        mAlertDialog.dismiss();
        mAlertDialog = null;
    }
}

关键修复点说明

  1. 移除手动调用的onPause():让系统自行管理Activity生命周期,你只需要专注业务逻辑即可。
  2. 用Handler替代Timer:Handler和主线程绑定,能在Activity销毁时及时取消任务,从根源避免内存泄漏。
  3. 弹窗关闭后再跳转:确保弹窗完全销毁后再执行Activity跳转,彻底规避窗口泄漏的可能。
  4. 在onDestroy()清理资源:不管Activity是正常销毁还是意外销毁,都能及时取消定时任务、销毁弹窗,斩断所有可能的引用链。

如果你觉得Handler的写法有点繁琐,也可以用Android自带的CountDownTimer,它天生为定时场景设计,同样能很好地和生命周期配合。

内容的提问来源于stack exchange,提问作者202207

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:15:47