好一陣子沒寫網路相關的程式了,最近有個專案剛好有連網的需求。好吧,把以前的程式拿出來用,但發現在 Android 2.3 的裝置運行正常,在 Android 4.0 的裝置就會出現 NetworkOnMainThreadException 這個錯誤。查了一下原來從 Android 3.0 開始,Thread Policy 加強了限制,只要嘗試在主執行緒中進行網路操作,就會產生這個錯誤。
解決方式有幾個:
1. 把網路操作從主執行緒中移走,你可以自己再開一個 Thread,或使用 AsyncTask 來執行。
2.在 onCreate() 中加入下列程式,透過 StrictMode 重新設定 ThreadPolicy。
3.把 AndroidManifest 中的 android:targetSdkVersion 設定成 9,也可以暫時解決,但不建議。
最好的方式還是第一種,能避免耗時的網路操作阻礙主執行緒工作,或產生 ANR 錯誤,我想這也是設計此例外的原因。
解決方式有幾個:
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 錯誤,我想這也是設計此例外的原因。
留言
張貼留言