手记

【九月打卡】第12天 ANR 异常和 OOM 异常面试问题

课程名称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 的场景会更多。但是不管是什么场景,产生的原因都是这一章介绍的内容,在解决问题时,可以从这些方面入手。

0人推荐
随时随地看视频
慕课网APP