1、ANR产生的原因是什么?
1.只有主线程才会产生ANR,主线程就是UI线程;
2.必须发生某些输入事件或特定操作,比如按键或触屏等输入事件,在BroadcastReceiver或Service的各个生命周期调用函数;
3.上述事件响应超时,不同的context规定的上限时间不同
a.主线程对输入事件5秒内没有处理完毕
b.主线程在执行BroadcastReceiver的onReceive()函数时10秒内没有处理完毕
c.主线程在Service的各个生命周期函数时20秒内没有处理完毕。
2、描述一下oom?
oom原因:
1.数据库的cursor没有关闭。
2.构造adapter没有使用缓存contentview。
3.调用registerReceiver()后未调用unregisterReceiver().
4.未关闭InputStream/OutputStream。
5.Bitmap使用后未调用recycle()。
6.Context泄漏。
7.static关键字等。
解决方案:
1、数据库使用后要进行关闭
2、第二个问题是listview存在的,建议弃用转用recycleview。
3、第三个很明显需要取消注册
4、关闭输入输出流
5、bitmap回收
6、常见引起context泄露的情况有内部类、强引用,这个也是最容易引起空指针异常的一类问题,当我们页面退出时,并不能有效清空内部类持有的引用导致内存泄漏,解决方法也多,如将内部类变成静态内部类,并在内部采用弱引用保存context;也还有一种解决方案,比如针对handler持有引用问题,可以绑定页面的生命周期,在ondestory里进行相应资源的回收,干掉内部类mHandler.removeCallbacksAndMessages(null);
7、private static Context mContext; 这种代码写在Activity里面就会出现内存泄漏问题,如果将Activity赋值到么mContext的话。那么即使该Activity已经onDestroy,但是由于仍有对象保存它的引用,因此该Activity依然不会被释放,并且,如果该activity里面再持有一些资源,那就糟糕了。这里最好写成全局的上下文就不会出现这种情况。
网友评论