一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。
解决方案有两个,一个是使用StrictMode,二是使用线程来操作网络请求。
第一种方法:简单暴力,强制使用,代码修改简单(但是非常不推荐) 在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码
| 1 2 3 4 | if(android.os.Build.VERSION.SDK_INT > 9) {    StrictMode.ThreadPolicy policy = newStrictMode.ThreadPolicy.Builder().permitAll().build();    StrictMode.setThreadPolicy(policy);} | 
第二种方法就是我使用的方法也是我要推荐的方法,将请求网络资源的代码使用Thread去操作。在Runnable中做HTTP请求,不用阻塞UI线程。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | publicvoidonCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    this.setContentView(R.layout.main_view);    newThread(runnable).start();}Handler handler = newHandler(){    @Override    publicvoidhandleMessage(Message msg) {        super.handleMessage(msg);        Bundle data = msg.getData();        String val = data.getString("value");        Log.i(TAG,"请求结果:"+ val);    }}Runnable runnable = newRunnable(){    @Override    publicvoidrun() {        // TODO: http request.        Message msg = newMessage();        Bundle data = newBundle();        data.putString("value","请求结果");        msg.setData(data);        handler.sendMessage(msg);    }} | 
上面是比较通用的方法,我的代码:
| 1 2 3 4 5 6 7 8 | // Android 4.0 之后不能在主线程中请求HTTP请求            newThread(newRunnable(){                @Override                publicvoidrun() {                    cachedImage = asyncImageLoader.loadDrawable(imageUrl, position);                    imageView.setImageDrawable(cachedImage);                }            }).start(); | 
解决android.os.NetworkOnMainThreadException,布布扣,bubuko.com
解决android.os.NetworkOnMainThreadException
原文:http://www.cnblogs.com/liukedong/p/3842299.html