项目从3月开始做,维护加上各种加功能,App直线增肥,从原来20M的性感美女变成的如今50M的中年大妈,各种繁乱的逻辑要了老命了。特别是上个月的内存泄漏导致的卡顿,能把人憋死。App一跑内存占用就300M+,好点的手机还能撑一阵,运行内存只有2G的用不到10分钟就各种ANR。好了废话不多说,说下我的优化之路。
一、一开始我也是各种百度,然后我怀疑是强引用过多,就写了个软应用工具类,把用的强应用都替换了
public static void setSoft(String objname,Object object){ softReference=new SoftReference<>(object); softReferenceMap.put(objname,softReference); } public static <T extends Object> T getSoft(String key){ SoftReference<Object> softReference=softReferenceMap.get(key); if(softReference==null){ return null; }else { return (T)softReference.get(); } }不知道写的对不对啊,大神请指正。不过并没有卵用,该卡还是卡。
我想我得换个思路,得把问题找到,于是我升级了Android Studio 3.0 ,把自带的Android Profiler调出来
频繁的回收会导致滑动卡顿,进而引发OOM.检测出来发现是商城的Activity对象发生了泄漏。导致Activity对象被持有无法被回收。
找到原因就是下一步
询漏之旅:内存泄漏无法以下几点:1.注册了广播没反注册 2.线程没取消 3.内部类非静态 4.单例 5.数据库游标未关闭 6.Handler 7.webview资源未释放
我把所有都试了一遍,内存泄漏解决了,不过效果不大,内存占用还是很高,后面我又加了阿里云对展示图片进行裁剪,减少内存占用 。到了这一步我也快疯了,没办法,运行十分钟照样卡,再加上商城又加了一个多线程的限时抢购,用timer做的。那内存,酸爽的一bi。
换个思路:后面我想了下是不是控件的原因呢,毕竟该优化都做了,唯一没动的就是Xml文件了,没错,布局过于复杂也会引发内存占用过大,因为商城需求的多样化,布局被我写得臃肿不堪,各种嵌套,Scrollview套LinearLayout ,LinearLayout加ListView ,ListView里还有RecyclerView 。。。说说解决办法:去掉scrollview 用Gridview替换掉Recycleview 把大列表顶部作为一个头布局直接进行加载,头布局里的逻辑在头布局的initHeadView方法里处理。做到这基本就能保证在配置不是那么好的手机上完美运行了
当然,代码优化之路任重道远,愿我的经历能帮助到你。