Android高德地图踩坑记录-内存泄漏问题
1、问题现象
最近做项目优化,在查找app可能存在的内存泄漏地方,项目中有用到高德地图SDK,有一个页面有展示地图,每次退出该页面的时候,LeakCanary老是提示有内存泄漏,泄漏的大概信息如下:
2、排查问题
看样子像是高德地图相关的内存泄漏
,不过为了进一步可以定位到问题,通常可以采用一种虽然有些笨但是可以定位到问题点的方法:控制变量法
,排除到不太可能出现问题的地方,只保留可能出现的问题,具体是先注释掉和高德地图无关的代码,然后复现问题,确保问题是出在和高德地图相关的代码上
经过一系列的注释代码然后复现操作,明确内存泄漏的点是在高德地图相关的操作上,通过分析LeakCanary生成的Heap Dump(堆转储)文件,也验证了这个猜想
我在代码里有封装过一个关于地图操作的utils类,刚开始以为是在页面销毁的时候,这个utils类里有一些资源没有释放,比如当前Activity的context引用,在改为Application引用之后,发现问题还是有,然后在Activity销毁的时候,对utils里的一些资源进行了释放,发现还是不可以
后来经过在网上查找资料,查看高德地图官方demo,发现一个细节有可能是使用Butterknife的问题
因为在onDestroy方法里,我有写MapView的销毁方法,但是没有进入到if语句里面
3、问题解决方式
不使用ButterKnife的方式获取MapView控件,采用原生的findViewById的方式来获取控件对象
经过反复测试,退出页面之后,LeakCanary没有报内存泄漏的吐司
4、总结
使用高德地图SDK,地图控件MapView,使用原生的findViewById的方式来获取