报错日志
2023-07-19 19:05:43.780 11493-11493/? A/DEBUG: Build fingerprint: 'rockchip/rk3326_go/rk3326_go:9/PQ2A.190305.002/root08251804:userdebug/test-keys'
2023-07-19 19:05:43.780 11493-11493/? A/DEBUG: Revision: '0'
2023-07-19 19:05:43.781 11493-11493/? A/DEBUG: ABI: 'arm'
2023-07-19 19:05:43.781 11493-11493/? A/DEBUG: pid: 11078, tid: 11078, name: .org.video_lock >>> com.org.video_lock <<<
2023-07-19 19:05:43.781 11493-11493/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
2023-07-19 19:05:43.781 11493-11493/? A/DEBUG: Abort message: 'Error, cannot access an invalid/free'd bitmap here!'
2023-07-19 19:05:43.781 11493-11493/? A/DEBUG: r0 00000000 r1 00002b46 r2 00000006 r3 00000008
2023-07-19 19:05:43.781 11493-11493/? A/DEBUG: r4 00002b46 r5 00002b46 r6 ffd42644 r7 0000010c
2023-07-19 19:05:43.781 11493-11493/? A/DEBUG: r8 e6d8b480 r9 00000000 r10 00000000 r11 ffd42b9c
2023-07-19 19:05:43.782 11493-11493/? A/DEBUG: ip ffd425e0 sp ffd42630 lr e8367e49 pc e835fc96
之前看到这种崩溃日志的时候,我都要崩溃了,还好里面有关键信息,可以帮助排查cannot access an invalid/free’d bitmap here!
我出现这个问题的原因是bitmap 显示在dialog 上面,而在这个Dialog还未消失时,就调用 bitmap.recycle() 回收bitmap 造成的
所以 所以,一定确保bitmap不再使用,再去回收它
在以下情况下应该回收 bitmap:
- 当你确定不再需要 bitmap 时,比如在 Activity 或 Fragment 的 onDestroy() 方法中。
- 如果 bitmap 已经从 UI 中移除,不再显示在任何 UI 元素上。
- 当需要释放内存或减少资源占用时。
解决办法就是在Dialog 设置 setOnDismissListener 监听,消失的时候调用
// 回收 bitmap
if (bitmap != null) {
bitmap.recycle();
bitmap = null;
}