標籤:
問題描述:
1、當前的項目用的是4.3,經過斷點調試,知道錯誤發生在
HttpURLConnection con = (HttpURLConnection)url.openConnection();//開啟一個connection串連 con.setRequestMethod("GET"); con.setConnectTimeout(5000); //得到伺服器返回來的流 InputStream is = con.getInputStream();//錯誤拋出的地方
並報出如下錯誤:
03-14 14:27:38.428: W/System.err(30191): android.os.NetworkOnMainThreadException
03-14 14:27:38.429: W/System.err(30191): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1134)
解決:
經過網上尋找相關資料得知,Android 2.3及以上版本開始提供了一個新的類 StrictMode,該類可以用於捕捉髮生在應用程式主線程中耗時的磁碟、網路訪問或函數調用,可以協助開發人員改進程式,使主線程處理 UI 和動畫在磁碟讀寫和網路操作時變得更平滑,避免主線程被阻塞。
此處是主線程訪問網路時出的異常。 Android在4.0之前的版本支援在主線程中訪問網路,但是在4.0以後對這部分程式進行了最佳化,也就是說訪問網路的代碼不能寫在主
線程中了。
網上相關資料得知,在主線程中添加如下代碼即可解決:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // 這裡可以替換為detectAll() 就包括了磁碟讀寫和網路I/O .penaltyLog() //列印logcat,當然也可以定位到dropbox,通過檔案儲存相應的log .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() //探測SQLite資料庫操作 .penaltyLog() //列印logcat .penaltyDeath() .build());
報android.os.NetworkOnMainThreadException錯誤