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

Android销毁Activity失败:点击返回按钮应用崩溃求助

Android Activity销毁时崩溃:java.lang.RuntimeException: Unable to destroy activity

我来帮你梳理下点击返回按钮时应用崩溃的可能原因,以及对应的解决思路:

核心问题定位

崩溃发生在CreateCollageActivity的onDestroy方法第740行,结合你提供的代码和异常信息,大概率是空指针异常或者资源回收时的线程冲突导致onDestroy执行失败,进而抛出RuntimeException。

可能的原因及解决方案

1. 嵌套对象的空指针异常

你的代码虽然做了外层的null判断,但嵌套调用时漏掉了内层对象的检查。比如这段代码:

for (int j = INDEX_COLLAGE; j < collageView.shapeLayoutList.get(i).shapeArr.length; j += INDEX_COLLAGE_BACKGROUND) {

如果collageView.shapeLayoutList.get(i)返回null,或者shapeArr本身是null,这里会直接抛出空指针,中断onDestroy的执行。

解决办法:逐层添加null判断,避免链式调用的空风险:

if (collageView != null) {
    if (collageView.shapeLayoutList != null) {
        for (i = INDEX_COLLAGE; i < collageView.shapeLayoutList.size(); i += INDEX_COLLAGE_BACKGROUND) {
            // 先获取当前item并判断是否为空
            ShapeLayout currentLayout = collageView.shapeLayoutList.get(i);
            if (currentLayout != null && currentLayout.shapeArr != null) {
                for (int j = INDEX_COLLAGE; j < currentLayout.shapeArr.length; j += INDEX_COLLAGE_BACKGROUND) {
                    if (currentLayout.shapeArr[j] != null) {
                        currentLayout.shapeArr[j].freeBitmaps();
                    }
                }
            }
        }
    }
    // 其他Bitmap回收代码同理,确保每一层对象都不为空
}

2. 异步任务与Bitmap回收的线程冲突

当用户点击"Yes"按钮后,SaveImageTask会在后台执行图片保存操作,如果此时用户快速点击返回按钮触发onDestroy,后台任务可能还在使用某个Bitmap,而onDestroy里直接回收了这个Bitmap,就会导致Bitmap被回收后被访问,抛出异常。

解决办法:

  • 给异步任务添加取消逻辑,在onDestroy时终止未完成的任务:
// 先在Activity里声明任务变量
private SaveImageTask saveImageTask;

// 启动任务时赋值
saveImageTask = new SaveImageTask();
saveImageTask.execute();

// 在onDestroy里取消任务
@Override
protected void onDestroy() {
    super.onDestroy();
    // 先取消异步任务,避免后台操作已回收的Bitmap
    if (saveImageTask != null && !saveImageTask.isCancelled()) {
        saveImageTask.cancel(true);
    }
    // 后续的Bitmap回收和资源释放代码...
}
  • 同时在SaveImageTask的后台逻辑中,每次操作Bitmap前检查状态:
private class SaveImageTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        // 任务被取消则直接返回
        if (isCancelled()) return null;
        
        // 操作Bitmap前检查是否可用
        if (targetBitmap != null && !targetBitmap.isRecycled()) {
            // 执行图片保存逻辑
        }
        return null;
    }
}

3. AdWhirlLayout销毁时的异常

adWhirlLayout.destroy()可能内部存在未处理的异常(比如重复销毁、资源已释放),导致onDestroy执行失败。

解决办法:用try-catch包裹销毁逻辑,避免崩溃扩散:

if (adWhirlLayout != null) {
    try {
        adWhirlLayout.removeAllViews();
        adWhirlLayout.destroy();
    } catch (Exception e) {
        // 记录日志,不要让异常终止onDestroy的执行
        e.printStackTrace();
    }
    // 置空避免后续重复操作
    adWhirlLayout = null;
}

额外排查建议

  • 查看完整的异常堆栈信息,找到Caused by的具体异常类型(比如NullPointerException),能直接定位到出错的代码行;
  • 可以在onDestroy的关键代码块前后添加日志,确认哪一步触发了崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:23:14