2013年11月1日小光棍節java
有一段時間沒有發表新的博客了,最近一直在忙着開發新浪微博客戶端遇到不少問題比較頭痛,好比說本篇博客要講的NetworkOnMainThreadException這個異常,這是可能常常問題,在筆試題中也可能會問到,因此值得記錄一下。網絡
爲何會出現這個異常,先解析一下它的字面意思,在主線程網絡操做出現異常。很明顯是在主線程也就是UI線程進行了比較耗時的網絡操做,這種代碼實現是不符合編碼規範的, 由於在Android裏在UI線程進行超過5秒的操做就好彈出ANR對話框,表示Android無響應。而且在Android2.3及以上引入了StrictMode這個類,是用來幫助開發者改進他們編寫的應用,而且提供了各類的策略,這些策略能隨時檢查和報告開發者開發應用中存在的問題,好比能夠監視那些本不該該在主線程中完成的工做或者其餘的一些不規範和很差的代碼,因此纔會報錯。異步
小巫呢,最近在開發新浪微博客戶端,須要進行網絡操做就遇到了這個錯誤,剛開始還不清楚怎麼解決,後來查了一下就明白是怎麼回事了,Android4.0是不容許網絡操做在主線程中進行的,那麼怎麼解決。很簡單把網絡請求操做經過異步的方式來作,Android能夠用於進行異步操做的類有AsyncTack和Handler,具體想怎麼用看項目要求。ide
使用Handler編碼
方法1:Handler 子線程調用Handler的sendMessage(message)發送事件。 Handler handler= new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); //操做界面 textView.setText("zhangkai281"); } }; public class MyThread extends Thread { public void run() { // 耗時操做 loadNetWork(); Message msg = new Message(); handler.sendMessage(msg);//向Handler發送消息, } }
使用AsyncTaskurl
//UI線程中執行 new DownloadImageTask().execute( "www.91dota.com" ); private class LoadTask extends AsyncTask { protected String doInBackground( String... url ) { return loadDataFormNetwork( url[0] );//後臺耗時操做 } protected void onPostExecute( String result ) { myText.setText( result ); //獲得來自網絡的信息刷新頁面 }