檢測Android Dialog內存泄漏需結合工具和代碼分析,具體步驟如下:

1. 工具檢測

  • LeakCanary:集成到項目後自動檢測Activity泄漏,間接反映Dialog泄漏:
dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
}

Application初始化:

if (!LeakCanary.isInAnalyzerProcess(this)) {
    LeakCanary.install(this);
}
  • 優勢:自動捕獲泄漏並生成詳細報告。
  • 侷限:僅檢測Activity泄漏,需結合其他方法。
  • Android Profiler:實時監控內存使用:
  • 打開Profiler → Memory視圖 → 觸發Dialog場景 → 捕獲堆轉儲(Heap Dump)。
  • 分析:識別Dialog對象的引用鏈,查找泄漏點。

2. 代碼分析

  • 生命週期管理:確保Dialog在Activity銷燬時關閉:
@Override
protected void onDestroy() {
    super.onDestroy();
    if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
    }
}
  • 引用檢查:避免靜態持有Dialog實例,使用弱引用:
WeakReference<Dialog> dialogRef = new WeakReference<>(dialog);

3. 常見泄漏場景

  • 單例模式:Dialog作為單例持有Activity引用:
// 錯誤示例
public class DialogManager {
    private static DialogManager instance;
    private Dialog dialog; // 靜態持有Dialog
}
  • 修復:使用弱引用或DialogFragment替代。
  • Handler泄漏:Dialog中使用匿名Handler:
// 錯誤示例
new Handler().postDelayed(() -> {
    // 可能持有Dialog引用
}, 1000);
  • 修復:使用靜態Handler或HandlerThread

4. 綜合策略

  • 工具輔助:LeakCanary檢測Activity泄漏,結合Profiler定位Dialog泄漏。
  • 代碼優化:避免靜態持有、使用弱引用、及時銷燬Dialog。

通過以上方法,可有效檢測和修復Dialog內存泄漏問題。