解決 NetworkOnMainThreadException 的問題

好一陣子沒寫網路相關的程式了,最近有個專案剛好有連網的需求。好吧,把以前的程式拿出來用,但發現在 Android 2.3 的裝置運行正常,在 Android 4.0 的裝置就會出現 NetworkOnMainThreadException 這個錯誤。查了一下原來從 Android 3.0 開始,Thread Policy 加強了限制,只要嘗試在主執行緒中進行網路操作,就會產生這個錯誤。

解決方式有幾個:
1. 把網路操作從主執行緒中移走,你可以自己再開一個 Thread,或使用 AsyncTask 來執行。

2.在 onCreate() 中加入下列程式,透過 StrictMode 重新設定 ThreadPolicy。
if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
        .detectDiskReads()
        .detectDiskWrites()
        .detectNetwork()   // or .detectAll() for all detectable problems
        .penaltyLog()
        .build());
}

3.把 AndroidManifest 中的 android:targetSdkVersion 設定成 9,也可以暫時解決,但不建議。

最好的方式還是第一種,能避免耗時的網路操作阻礙主執行緒工作,或產生 ANR 錯誤,我想這也是設計此例外的原因。

這個網誌中的熱門文章

Android Studio 如何調整字型大小

App 在 Google Play 被停權與恢復的經驗分享

Android Studio 無法在實機上 Run/Debug 程式?