原文地址:http://my.oschina.net/coconet/blog/71949
这两天着手Android网络应用,突然发现Android3.0以上的版本中 访问网络 总是会出现下面这个异常
android.os.NetworkOnMainThreadException
花了一下午的时间猜弄明白,较高版本的Android中提供了一个新的类 StrictMode,这个类用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用,可以帮助开发者改进程序,使主线程处理 UI 和动画在磁盘读写和网络操作时变得更平滑,避免主线程被阻塞。
有人说使用异步方式,下面的代码是抄来的,仅供参考:
new Thread(){
@Override
public void run(){
//你要执行的方法
//执行完毕后给handler发送一个空消息
handler.sendEmptyMessage(0);
}
}.start();
//定义Handler对象
private Handler handler =new Handler(){
@Override
//当有消息发送出来的时候就执行Handler的这个方法
public void handleMessage(Message msg){
super.handleMessage(msg);
//处理UI
}
};
这个方法是最符合规范的,但是对于之前版本的代码修改起来很麻烦。
还有一个更简单的方法,就是在onCreate方法中,访问网络或者硬盘之前调用如下方法:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll().build();
这个方法只有在2.3以上才能使用,因为StrictMode是2.3以后才提供的。这个方法相当于拒绝了Android新提供的程序改进,但是对于老代码的修改,是最好的。
另外也可以在资源配置文件中将支持版本改为8或以下,但是这实际上使用了老版本,所以最好不使用。