天天看点

ANR异常

作为一个开发人员,即使你不知道ANR异常,你肯定也遇到过程序无响应,其实ANR就是程序无响应(Application Not Responding)。那么什么是ANR呢?

一、什么是ANR?

ANR就是Application Not Responding,是安卓中弹出的一个对话框,让用户来选择等待或者直接关闭程序。activity响应超过5秒,service响应超过10秒,都会出现ANR。

二、ANR产生的原因

刚才也说了,activity响应超过5秒,service响应超过10秒,都会出现ANR。那么为什么activity或者service会用这么长时间来响应呢?最大的原因可能就是主线程被阻塞了。所以产生ANR的原因有以下两个:

  • 主线程中存在耗时的计算
  • 主线程被IO操作阻塞(安卓4.0以后,网络IO禁止在主线程执行)

那么安卓中有哪些是在主线程中执行的呢?

  • activity的所有生命周期方法;
  • service默认是在主线程的;、
  • broadcast中的onReceive()回调方法;
  • AsyncTask中除了doInBackgroud方法,其他的四个方法都是在主线程中的;
  • Handler的handleMessage()和post(Runnable)方法,前提是这个Handler没有使用子线程的looper。

基本上就是这么多,所以在上述这些方法中是绝对不能做耗时操作的,否则就会出现ANR异常。

三、怎么避免ANR?

避免ANR的总方针就是不要阻塞主线程,具体的方法有以下这些:

  • 使用AsyncTask来进行耗时操作;
  • 使用Thread或者HandlerThread来提高线程优先级;
  • 使用Handler来处理工作线程;
  • 不要在Activity中执行耗时的计算。

一般做到以上几步就可以避免ANR了。

继续阅读