報android.os.NetworkOnMainThreadException錯誤


問題描述:

 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()); 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM