Android.os.NetWorkOnMainThreadException的处理及多线程中更新ListView数据

来源:互联网 发布:手机不休眠软件 编辑:程序博客网 时间:2024/06/14 07:24

在2.x中访问网络不会出理Android.os.NetWorkOnMainThreadException异常,但在4.0版本中运行则会报此错误(在主线程访问网络时出的异常),

Android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中

 

网上很多使用

        // 详见StrictMode文档
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()   // or .detectAll() for all detectable problems
                .penaltyLog()
                .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .detectLeakedClosableObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());

这种方法解决,但detectLeakedClosableObjects() 会报错误,因为detectLeakedClosableObjects需要4.0以上的SDK,2.x中是没有的

 

接下来只能采用多线程解决

 

//定义线程

Runnable searchGooRunnable = new Runnable()
 {

  @Override
  public void run()
  {
   // TODO Auto-generated method stub
   try
   {
    Looper.prepare();
    ProgressDialog.show(MainActivity.this, "查询", "正在连接服务器,请稍等");
    Log.e("ycsmart", "开始线程执行");
    ...

    Log.e("test", "线程执行结束");
    Looper.loop();
   } catch (Exception ex)
   {
    Log.e("test", ex.toString());
   }
  }
 };

 

//定义消息接收

@SuppressLint("HandlerLeak")
 private Handler hander = new Handler()
 {
  @Override
  public void handleMessage(Message msg)
  {
   Log.e("test", "测试消息");
  }
 };

 

执行线程

new Thread(searchGooRunnable).start();

 

 

Thread中无法处理UI的更新,所以使用 Handler 来接受需要更新 UI 的消息