三个多月前换了新工作,新公司的项目是从外包开发的半成品。代码可圈可点,但就是稳定性差点;动不动就无响应;迫于时间紧凑,于近日,才将其解决。故作记录;
我们都知道,造成ANR的根本原因无非是在:Activity中超过5s无响应、Broasdcastreceiver中超过10s、Service中超过20s;如上,就会是页面卡死,用户体验极差;
在仔细阅读完项目代码后,发现:
1、项目中频繁使用Handler、在Activity的onCreate()、onResume()生命周期中有不尽相同数量的对象创建;
2、因为项目中用到了Socket,故大面积的使用了BroadCastReceiver,而且在里面有不同的网络请求;
3、接口较多,且接口响应迟缓;
4、static修饰的静态变量较多;
故针对以上几点,对项目进行了优化,成功解决了无响应的问题,优化细节如下:
1、Handler的使用优化:弱引用:handler正确使用代码如下:
private final MHandler mHandler = new MHandler(this);
private static class MHandler extends Handler { private final WeakReference<LoginActivity> mHActivity; public MHandler(LoginActivity activity) { mHActivity = new WeakReference<LoginActivity>(activity); } }
2、关于后台数据响应较慢,是因为后台数据冗余,检索速度较慢,需后台小伙伴对接口进行优化,增加索引等;
3、尽量少的在Activity的onCreate()、onResume()方法中创建对象;
4、尽量避免在BroadCastReceiver中做好事操作或是计算;
5、尽量不用static修饰变量;
6、集合、bitmap等不使用之后切记对资源进行释放;
7、避免重复多次的网络请求;
经过如上一波修改,ANR不再频发;以上是我个人就此次项目遇到问题的解决过程,哪里说的不对,还望各位指正;