閱讀65 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【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.javasetContentView(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類的。

二:使用ThreadRunnableHandler這三個類:

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

  上一篇:go 為什麼你還一直在窮打工?
  下一篇:go 重要通知!新版OTS即將推出,及現有OTS公測版本下線通知!