【Android開發】解決安卓android.os.NetworkOnMainThreadException
解決android socket編程出現的Caused by: android.os.NetworkOnMainThreadException錯
本文轉自:https://blog.csdn.net/debutent/article/details/8708127
以前我的socket通信的代碼運行在android2.3.5手機上一點問題沒有,現在入手了小米2S(係統android4.1.1)後,發現出現如下問題,期間server端打開後異常關閉,在logcat中查看到了Caused by: android.os.NetworkOnMainThreadException錯誤,在https://stackoverflow.com/questions/13136539/caused-by-android-os-networkonmainthreadexception找到了答案,要在MainActivity.java的setContentView(R.layout.activity_main)後加入以下代碼
if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }
並在文件頭加入,import android.os.StrictMode
問題解決
對於什麼是StrictMode,可以參考https://www.cnblogs.com/zelos/archive/2011/02/27/1966403.html
還有一篇文章解釋的更清晰:
報android.os.NetworkOnMainThreadException異常,經過查文檔,原來是4.0係統不允許主線程(UI線程)訪問網絡,因此導致了其異常。在4.0之後在主線程裏麵執行Http請求都會報這個錯,也許是怕Http請求時間太長造成程序假死的情況吧。
一:在發起Http請求的Activity裏麵的onCreate函數裏麵添加如下代碼:
//詳見StrictMode文檔
StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
如果正在做的項目不是Android 4.0的是看不到StrictMode類的。
二:使用Thread、Runnable、Handler這三個類:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.share_mblog_view); newThread(runnable).start(); } Handler handler=newHandler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle data=msg.getData(); String val= data.getString("value"); Log.i("mylog","請求結果為-->" +val); } } Runnable runnable=newRunnable(){ @Override public void run() { ////TODO: http request.// Message msg =newMessage(); Bundle data=newBundle(); data.putString("value","請求結果"); msg.setData(data); handler.sendMessage(msg); } }
開線程處理關於網絡的事物,然後用handler發送消息來處理更新UI。
自己走了不少彎路。
最後更新:2017-04-03 05:39:58