课程名称:BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师:DocMike
课程内容
ANR 异常
ANR(Applicationi Not Responding),应用程序无响应。在 Android 中如果应用程序有一段时间没有响应用户的操作,就会弹出 ANR 的对话框,影响用户的体验。
Android 系统会监控程序的响应状况,不同的组件发生 ANR 的时间是不一样的。
- Activity:5 秒,应用在 5 秒内未响应用户的输入事件(如按键或者触摸等)。
- BroadCastReceiver :10 秒,即 BroadcastReceiver 未在 10 秒内完成相关的处理。
- Service:20 秒(均为前台),即 Service 在 20 秒内没有完成相关的业务处理。
应用程序的响应性是由 ActivityManager 和 WindowManager 系统服务监控的,引起 ANR 的主要原因:
- 主线程被 IO 操作(从 4.0 之后网络 IO 不允许在主线程中)阻塞;
- 主线程中存在耗时的计算;
Android 中哪些操作是在主线程的呢?
- Activity 的所有生命周期回调都是执行在主线程的。
- Service 默认是执行在主线程的。
- BroadcastReceiver 的 onReceive 回调是执行在主线程的。
- 没有使用子线程的 looper 的 Handler 的 handleMessage() 方法,post() 方法都是执行在主线程的。
- AsyncTask 的回调方法中除了 doInBackground() 方法,其它都是执行在主线程。
如何解决 ANR?
- 使用 AsyncTask 处理耗时的 IO 操作;
- 使用 Thread 或者 HandlerThread 提高优先级;
- 使用 Handler 来处理工作线程的耗时任务;
- Activity 的 onCreate() 和 onResume() 回调中尽量避免耗时的代码。
OOM 异常
什么是 OOM?当前占用的内存加上我们申请的内存资源超过了 Dalvik 虚拟机的最大内存限制就会抛出 Out Of Memory 异常。
Android 中跟内存相关的一些容易混淆的概念
- 内存溢出(OOM)
- 内存抖动,即短时间内大量对象被创建和释放,触发 GC;
- 内存泄露,虚拟机中没有的垃圾对象还直接或间接地被引用着。
如何解决 OOM?
- 适当调整图像的大小,系统分配给图像的显示区域有限,对于超大的图片,在加载到内存之前,可以通过适当调节采样率来加载图片。
- 使用图像缓存,在 RecyclerView 或 Gallery 等控件中,一次加载大量图片时,可以只加载屏幕显示的资源,不加载尚未显式的内容,对于移出屏幕的资源及时释放。
- 采用低内存占用量的编码方式,来压缩图片,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存。
- 捕获异常,为了避免应用在分配 Bitmap 内存的时候出现 OOM 异常以后 Crash 掉,需要特别注意实例化Bitmap 部分的代码。通常,在实例化 Bitmap 的代码中,一定要对 OOM 异常进行捕获。
课程收获
这一章对 Android 中常见的 ANR 异常和 OOM 异常进行了梳理,在实际的开发中,面临会产生 ANR 和 OOM 的场景会更多。但是不管是什么场景,产生的原因都是这一章介绍的内容,在解决问题时,可以从这些方面入手。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦