Android性能之 ANR 分析解決

ANR全名Application Not Responding, 也就是"應(yīng)用無響應(yīng)". 當(dāng)操作在一段時間內(nèi)系統(tǒng)無法處理時, 系統(tǒng)層面會彈出上圖那樣的ANR對話框.

產(chǎn)生ANR原因

在Android里, App的響應(yīng)能力是由Activity Manager和Window Manager系統(tǒng)服務(wù)來監(jiān)控的. 通常在如下兩種情況下會彈出ANR對話框:

  1. 5s內(nèi)無法響應(yīng)用戶輸入事件(例如鍵盤輸入, 觸摸屏幕等).
  2. BroadcastReceiver在10s內(nèi)無法結(jié)束.

造成以上兩種情況的首要原因就是在主線程(UI線程)里面做了太多的阻塞耗時操作, 例如文件讀寫, 數(shù)據(jù)庫讀寫, 網(wǎng)絡(luò)查詢等等.

如何避免ANR

知道了ANR產(chǎn)生的原因, 那么想要避免ANR, 也就很簡單了, 就一條規(guī)則:

不要在主線程(UI線程)里面做繁重的操作.

可能產(chǎn)生ANR的條件

  1. 普通阻塞導(dǎo)致的ANR
  2. CPU滿負荷即硼,這時候一般會在 trace中最后一句看到(100%TOTAL: 5.9% user + 4.1% kernel + 89% iowait)
  3. 內(nèi)存原因(其實內(nèi)存原因有可能會導(dǎo)致ANR, 例如如果由于內(nèi)存泄露, App可使用內(nèi)存所剩無幾, 我們點擊按鈕啟動一個大圖片作為背景的activity, 就可能會產(chǎn)生ANR)

ANR的處理

針對三種不同的情況, 一般的處理情況如下

  1. 主線程阻塞的

開辟單獨的子線程來處理耗時阻塞事務(wù).

  1. CPU滿負荷, I/O阻塞的

I/O阻塞一般來說就是文件讀寫或數(shù)據(jù)庫操作執(zhí)行在主線程了, 也可以通過開辟子線程的方式異步執(zhí)行.

  1. 內(nèi)存不夠用的

增大VM內(nèi)存, 使用largeHeap屬性, 排查內(nèi)存泄露(這個在內(nèi)存優(yōu)化那篇細說吧)等.

知識點

哪些地方是執(zhí)行在主線程的
  1. Activity的所有生命周期回調(diào)都是執(zhí)行在主線程的.
  2. Service默認是執(zhí)行在主線程的.
  3. BroadcastReceiver的onReceive回調(diào)是執(zhí)行在主線程的.
  4. 沒有使用子線程的looper的Handler的handleMessage, post(Runnable)是執(zhí)行在主線程的.
  5. AsyncTask的回調(diào)中除了doInBackground, 其他都是執(zhí)行在主線程的.
  6. View的post(Runnable)是執(zhí)行在主線程的.
使用子線程的方式有哪些
  1. 啟Thread方式(繼承Thread卒密、實現(xiàn)Runnable接口)
  2. 使用AsyncTask
  3. HandlerThread
  4. IntentService
  5. Loader
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末然磷,一起剝皮案震驚了整個濱河市栋豫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榴啸,老刑警劉巖命迈,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件识樱,死亡現(xiàn)場離奇詭異,居然都是意外死亡猴贰,警方通過查閱死者的電腦和手機对雪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來米绕,“玉大人瑟捣,你說我怎么就攤上這事∫逯#” “怎么了蝶柿?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長非驮。 經(jīng)常有香客問我交汤,道長,這世上最難降的妖魔是什么劫笙? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任芙扎,我火速辦了婚禮,結(jié)果婚禮上填大,老公的妹妹穿的比我還像新娘戒洼。我一直安慰自己,他們只是感情好允华,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布圈浇。 她就那樣靜靜地躺著,像睡著了一般靴寂。 火紅的嫁衣襯著肌膚如雪磷蜀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天百炬,我揣著相機與錄音褐隆,去河邊找鬼。 笑死剖踊,一個胖子當(dāng)著我的面吹牛庶弃,可吹牛的內(nèi)容都是我干的衫贬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼歇攻,長吁一口氣:“原來是場噩夢啊……” “哼固惯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掉伏,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤缝呕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斧散,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供常,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年鸡捐,在試婚紗的時候發(fā)現(xiàn)自己被綠了栈暇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡箍镜,死狀恐怖源祈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情色迂,我是刑警寧澤香缺,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站歇僧,受9級特大地震影響图张,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诈悍,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一祸轮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侥钳,春花似錦适袜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至给猾,卻和暖如春躏啰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耙册。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毫捣,地道東北人详拙。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翩肌。 傳聞我的和親對象是個殘疾皇子迂苛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容