Android ANR異常及解決方法

今天面試遇到這道題,剛開始沒看出這個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();
              }
};
相關文章
相關標籤/搜索