今天面試遇到這道題,剛開始沒看出這個anr縮寫的意思,後來問了面試官原來是這個意思:java
ANRs (「Application Not Responding」),意思是」應用沒有響應「。面試
在以下狀況下,Android會報出ANR錯誤:編程
– 主線程 (「事件處理線程」 / 「UI線程」) 在5秒內沒有響應輸入事件網絡
– BroadcastReceiver 沒有在10秒內完成返回優化
一般狀況下,下面這些作法會致使ANRspa
一、在主線程內進行網絡操做線程
二、在主線程內進行一些緩慢的磁盤操做(例如執行沒有優化過的SQL查詢)code
應用應該在5秒或者10秒內響應,不然用戶會以爲「這個應用很垃圾」「爛」「慢」…等等orm
在sdk高版本後基本都已經告別在主線程操做網絡請求了,被問到這題我也是挺鬱悶的,真心沒遇到,即便谷歌官方沒有作限制,有一點良好編程習慣的人也不會這麼操做。事件
邏輯應該是
1. new出一個新的線程,進行數據請求
2. 獲取數據後,調用handler.sendMessage方法
3. 在handler的handle()方法中更新UI
這樣就能夠,或者也能夠這樣
private Thread mthread; private Handler mhandler; oncreate: mthread = new Thread(runnable);//這裏是在主線程中建立一個子線程,不會阻塞UI mthread.start();
private Runnable runnable = new Runnable (){ void run(){ //作耗時的數據處理 //處理完畢 mhandler.sendEmptyMessge(1000);//這裏發消息通知UI能夠更新了 } };
mhandler = new Handler(){ void handleMessgae(Message msg){ if(msg.what == 1000){ //更新UI } super.handlMessgae(); } };