ANR產生的原因,以及解決步驟

ANR全稱:Application Not Responding,即應用程序未響應。

主要原因:

應用程序進程中的主線程響應超時,則會產生ANR

(1)應用程序自身引起的。比如:主線程阻塞、掛起、死循環、執行比較長的耗時操作

(2)其他進程引起的。比如:其他進程對CPU的時間占用率過高,導致應用進程搶不到CPU的時間片。

響應超時體現:

(1)應用程序的主線程對輸入事件,5s內沒有處理完畢

(2)應用程序主線程在執行BroadcastReceiver的onReceive()函數時,10s內沒有處理完畢

(3)應用程序主線程在執行Service的各個生命周期函數時,20s內沒有處理完畢

解決步驟:

當發生ANR的時候,ActivityManagerService(AMS)會把ANR信息寫到LogCat日志中。我們打開Android Device Monitor查看LogCat日志,主要通過ANRManager、ActivityManager等字段過濾出我們想要的信息,保存到文件。文件主要看以下幾條信息:

(1)ANR In (Process Name)【Short Component Name】即ANR發生在哪個進程,哪個包/類里,定位到類。

(2)PID ?應用程序進程ID

(3)Reason ?ANR發生的原因提示。有:Input dispatching timed out.(輸入事件引起的ANR);ExecutingService...(Service執行任務引起的ANR);Broadcast of ...(廣播引起的ANR)

(4)Process CPU state ?分析各進程的時間占用率,來判斷某些進程是否長期占用CPU過高,導致應用進程獲取不到足夠的CPU處理時間,而發生ANR。比如:各進程總的CPU占用率,用戶CPU時間占用率、系統CPU時間占用率、iowaitCPU時間占用率

總結:

ANR在日常開發過程中,主要還是應用程序的主線程做了過多耗時操作導致,耗時操作放在子線程即可。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,524評論 25 708
  • java 接口的意義-百度 規范、擴展、回調 抽象類的意義-樂視 為其子類提供一個公共的類型封裝子類中得重復內容定...
    交流電1582閱讀 2,279評論 0 11
  • Object C中創建線程的方法是什么?如果在主線程中執行代碼,方法是什么?如果想延時執行代碼、方法又是什么? 1...
    AlanGe閱讀 1,793評論 0 17
  • 跪在父親面前,痛心而又有些迷茫,想他又感到一絲陌生,我默默地看著他的房子,涌出了些淚水。十年的不見,不知該如何表達...
    回歸本心閱讀 245評論 0 0
  • 這周回顧愿景中的關注,想起我們經常說的八大關注。也許有些是你的愛好,有些是你的責任與義務等等。其實我認為的關注其實...
    朕妮閱讀 177評論 0 0