背景
- 使用kotlin开发Android App
- 集成高德地图
- 按照文档在集成的Fragment中onDestory等方法进行高德地图相关释放操作
发生内存泄漏概览
解决方法
- 找到图中对应的自己编写的部分 即HomeFrgment的Setting字段
- 查看Setting字段的生命及使用情况
lateinit var settings: UiSettings
- 修改为
private var settings: UiSettings ?= null
原因
- kotlin是一门空安全语言使用 lateinit var 声明变量,其意义为延迟加载,所声明的变量不可置为null
- 使用ButterKnife时由于有大量如下语法 ,认为可以取代?=null的写法所以出错,实质上?=null和在java中声明一个变量不赋值是等效的
@BindView(R.id.around_button)
lateinit var aroundButton: ImageButton
- mapview持有settings而setting不能null导致无法被GC回收,所以内存泄漏
建议
- 生命周期敏感组件尽量使用java开发
- 如果使用kotlin尽量少使用late var,宁可多些空校验(!!)
参考
[一个歪国人的github]https://github.com/bluelinelabs/Conductor/issues/234