天天看點

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了。

繼續閱讀