2019独角兽企业重金招聘Python工程师标准>>>
做Android很久了, 零零碎碎的坑踩了不少, 也有踩了又踩的. 回忆收集一下以备自查, 也让大家能瞄一眼.
RemoteView可能造成内存泄露, 这个坑是几年前踩的.
当时APP做了非常系统话通知栏模块. 上线后发现很多用户发通知时总奔溃. 跟了很久, 不明所以.
一日发现, 测试用的手机,一个多月没关机, 发通知栏特别卡. 拿来dump一下, 发现用于通知栏的RemoteView占用内存巨大.
扒来系统源码找到原因, 根源在于RemoteView.
在每次发动通知前, 最好重新构造一个RemovteView, 否则可能造成内存泄露
因为RemoteView, 事实上, 并不是Veiw. 而是一个"操作记录表".
它把所有用户的对于veiw的操作当做"Action"记录下来, 最终由Android的通知栏来模块来处理这些记录. 完成APP的通知行为.
RemovteView这个"操作记录表"不会remove任何记录. 每次通知, 都是从第一条Action, 一直执行到最新添加的Action.
这使将内存只增不减.同时通知栏显示卡顿. 因为从RemovteView 创建开始时所有的Action都会被执行. 太多必然卡顿.