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());