exception:android.os.NetworkOnMainThreadException
异常:android.os.NetworkOnMainThreadException
在做项目时,在于网络通信时直接将与网络通信的过程写在主线程里面,在4.0的版本上测试爆出异常:android.os.NetworkOnMainThreadException
网上搜索后找到的解决办法如下
一:在发起Http请求的Activity里面的onCreate函数里面添加如下代码:
//详见StrictMode文档 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
StrictMode类是2.3之后才有的,所以不能在2.2版本上使用,所以如果需要处理则需要将这些耗时操作,如网络通信,读取磁盘,数据库操作等用多线程来处理。
二:使用Thread、Runnable、Handler这三个类:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.share_mblog_view); new Thread(runnable).start(); } Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle data = msg.getData(); String val = data.getString("value"); Log.i("mylog","请求结果为-->" + val); } } Runnable runnable = new Runnable(){ @Override public void run() { // // TODO: http request. // Message msg = new Message(); Bundle data = new Bundle(); data.putString("value","请求结果"); msg.setData(data); handler.sendMessage(msg); } }
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();
int re= 线程中与后台通信部分;
switch(re){
case ResultInfo.SUCCESS:
{
/*对UI线程的操作需要回到主线程上*/
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
UI操作。。。。
}
});
}
break;
case ResultInfo.timeout:
{
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
UI操作。。。。
}
});
}
break;
}
Looper.loop();
}
});
t.start();
相信一万小时定律,我没天赋,但我能用努力和坚持来弥补

浙公网安备 33010602011771号