解決NetworkOnMainThreadException的問題

好一陣子沒寫網路相關的程式了,最近有個專案剛好有連線Server的需求。好吧,把以前的程式拿出來用,但發現在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 如何調整字型大小

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

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