問題描述:
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());