Android 3.* 到 4.* 版本在进行网络操作时出现 NetworkOnMainThreadException异常解决办法。
原来在android 3.0版本以下的网络操作 没有什么问题,但是最近在android 3.0 和 4.0版本上进行网络操作时总是出现NetworkOnMainThreadException异常,代码在2.2 ,2.3版本上使用没有问题
经过分析发现原来在3.0之后的android 版本规范要求进行网络操作时不能在主程序中直接执行,知道了原因后,看看怎么解决吧。
解决方案有2个:
方案1 在UI主线程中创建一个子线程,代码如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
new Thread(myRunnable).start();
//或者使用 Handler
}
Runnable myRunnable = new Runnable(){
public void run() {
// 判断sdcard是否允许操作
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// 关联SDCard中需要上传的文件
File file = new File(Environment.getExternalStorageDirectory()+ File.separator+ fileName.getText().toString());
FileEntity fe = new FileEntity(file, "binary/octet-stream");//指定需要上传的文件和上传数据格式(二进制流)
HttpPost post = new HttpPost("http://192.168.10.222:8080/AndroidWeb/upServlet");
post.setEntity(fe);//绑定参数
try {
HttpResponse response = new DefaultHttpClient().execute(post);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//判断服务器端响应是否正常
String msg = EntityUtils.toString(response.getEntity());//获得服务器端返回的结果
title.setText(msg);
}
} catch (Exception e) {e.printStackTrace();}
}
}
};
方案2 在程序入口Activity类的onCreate()方法中使用StrictMode类,作用于整个项目。
StrictMode类在运行过程中会输出很多日志,分析日志可以找到需要优化的代码。
代码如下:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());