ANR相關(guān)問題
1. 什么是ANR歌粥?
Application Not Responding : 應(yīng)用程序無響應(yīng)
如果一個(gè)應(yīng)用無法響應(yīng)用戶的輸入,系統(tǒng)就會(huì)彈出一個(gè) ANR 對(duì)話框缠沈。
2. 什么導(dǎo)致了ANR?
通常,如果應(yīng)用無法響應(yīng)用戶的輸入饲趋,系統(tǒng)就會(huì)發(fā)生 ANR。例如:
- 應(yīng)用在 UI 線程中被I/O 操作(通常是網(wǎng)絡(luò)請(qǐng)求)阻塞
- 應(yīng)用在 UI 線程中存在耗時(shí)操作(如計(jì)算等)
在 Android 系統(tǒng)中撤蟆,應(yīng)用的響應(yīng)受到 Activity Manager 和 Window Manager 這兩個(gè)系統(tǒng)服務(wù)的監(jiān)控奕塑。一旦應(yīng)用出現(xiàn)以下兩種情況,系統(tǒng)就會(huì)彈出 ANR 對(duì)話框:
- 應(yīng)用在5秒內(nèi)未響應(yīng)用戶的輸入事件(如按鍵或觸摸事件)
- BroadcastReceiver 未在10秒內(nèi)完成相關(guān)的執(zhí)行
3. 如何避免ANR枫疆?
基本思路:在UI線程中爵川,做的工作越少越好。耗時(shí)操作(如網(wǎng)絡(luò)請(qǐng)求息楔、數(shù)據(jù)庫操作或計(jì)算密集型操作)應(yīng)當(dāng)在工作線程中完成寝贡。
- 使用 AsyncTask