ANR产生的原因是什么?
ANR即Application Not Responding,顾名思义就是应用程序无响应。
在Android中,一般情况下,四大组件均是工作在主线程中的,Android中的Activity Manager和Window Manager会随时监控应用程序的响应情况,如果因为一些耗时操作(网络请求或者IO操作)造成主线程阻塞一定时间(例如造成5s内不能响应用户事件或者BroadcastReceiver的onReceive方法执行时间超过10s),那么系统就会显示ANR对话框提示用户对应的应用处于无响应状态。
不要让主线程干耗时的工作
不要让其他线程阻塞主线程的执行
ANR定位和修正
ANR一般有三种类型
KeyDispatchTimeout(5 seconds) –主要类型
按键或触摸事件在特定时间内无响应
BroadcastTimeout(10 seconds)
BroadcastReceiver在特定时间内无法处理完成
ServiceTimeout(20 seconds) –小概率类型
Service在特定的时间内无法处理完成
1、主线程当中执行IO/网络操作,容易阻塞。
2、主线程当中执行了耗时的计算。(比如自定义控件中的onDraw()方法)
在onDraw()方法里面创建对象容易导致内存抖动(绘制动作时会大量不间断调用,产生大量垃圾对象导致GC很频繁,就造成了内存抖动),
内存抖动就容易造成UI出现掉帧、卡顿等问题。
3、BroadCastReceiver没有在10秒内完成处理。
4、BroadCastReceiver的onReceived代码中也要尽量减少耗时的操作,建议使用IntentService处理。
5、Service执行了耗时的操作,因为Service也是在主线程当中执行的,所以耗时操作应该在Service里面开启子线程来做。
6、使用AsyncTask处理耗时的IO等操作。
7、Activity的onCreate和onResume回调中尽量耗时的操作。
oom是什么?怎么导致的,怎么解决?
内存泄漏是什么?
什么情况导致内存泄漏?(1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。
(2)引起内存泄露的原因
(3) 内存泄露检测工具 ------>LeakCanary
内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存溢出通俗的讲就是内存不够用。
内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,
但内存泄露堆积后果很严重,无论多少内存,迟早会被占光
内存泄露原因:
一、Handler 引起的内存泄漏。
解决:将Handler声明为静态内部类,就不会持有外部类SecondActivity的引用,其生命周期就和外部类无关,
如果Handler里面需要context的话,可以通过弱引用方式引用外部类
二、单例模式引起的内存泄漏。
解决:Context是ApplicationContext,由于ApplicationContext的生命周期是和app一致的,不会导致内存泄漏
三、非静态内部类创建静态实例引起的内存泄漏。
解决:把内部类修改为静态的就可以避免内存泄漏了
四、非静态匿名内部类引起的内存泄漏。
解决:将匿名内部类设置为静态的。
五、注册/反注册未成对使用引起的内存泄漏。
注册广播接受器、EventBus等,记得解绑。
六、资源对象没有关闭引起的内存泄漏。
在这些资源不使用的时候,记得调用相应的类似close()、destroy()、recycler()、release()等方法释放。
七、集合对象没有及时清理引起的内存泄漏。
通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合,让相关对象不再被引用。
如何防止线程的内存泄漏(出现在栈内存)?
使用线程池来进行对线程进行管理。
LruCache默认缓存大小
基本上设置为手机内存的1/8
如何通过广播拦截和abort一条短信?
首先添加接收短信的权限
在清单文件中注册广播接收器,设置该广播接收器优先级,尽量设高一点
创建一个BroadcastReceiver来实现广播的处理,并设置拦截器abortBroadcast();
广播是否可以请求网络?
子线程可以,主线程超过10s引起anr
广播引起anr的时间限制是多少?
在Android中Activity中阻塞5秒、Service 20秒、BroadCastReceiver 10秒,就会造成ANR。
计算一个view的嵌套层级
循环追寻父类父类,看看有多少,便有多少嵌套层级
while (view.getParents() != null) {
count++;
view = view.getParents();
}
ANR即Application
KeyDispatchTimeout 5 BroadCastReceiver 10
ServiceTimeout 20
@Override
92 public long notifyANR(InputApplicationHandle inputApplicationHandle,
KeyDispatchTimeout
setBroadcastTimeoutLocked(timeoutTime);
case BROADCAST_TIMEOUT_MSG: {
mServices.serviceTimeout((ProcessRecord)msg.obj);
Dialog d = new AppNotRespondingDialog(ActivityManagerService.this,
mContext, proc, (ActivityRecord)data.get("activity"),
onDraw 主线程当中执行IO/网络操作,容易阻塞。
oom是什么?怎么导致的,怎么解决?
out of memory memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存
integer long
view.getParents