加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

解决Only the original thread that created a view hierarc

(2013-03-26 09:13:22)
标签:

android移动开发

解决onlytheoriginalt

it

android线程

android的handler

分类: android开发 移动开发

    Android中使用多线程处理UI相关内容时可能会发现Logcat提示Only the original thread that created a view hierarchy can touch its views这样的错误,这主要是Android的相关View和控件不是线程安全的,我们必须做独立的处理这点比J2ME麻烦一些,这里Android给我们提供了很多方法,有关线程的,我们需要了解下J2ME中一些传统的线程创建方法,比如Runnable或直接new Thread(),大家需要了解UI线程、worker线程以及一些概念。

    首先我们需要注意,主线程或者这里说的原始线程original thread 一般情况下是UI线程,当然UI线程并不一定是主线程,我们不能长时间的阻塞该应用,在Android平台上可能会产生类似Force close或Wait这样的对话框这里我们成为ANR,这里除了使用ProgressDialog方式给用一个动态的进度代表当前处理并没有中断可能需要一些时间,所以android告诉大家相关的网络处理可以使用工作者线程,但是worker 线程不能处理显示元素即UI相关的View或 Widget包中的高层的控件(如果在worker线程中处理了UI的view,比如说显示TextView的内容等等,就会出现logcat中的错误),所以通过一个Handler对象可以很好的传递Runnable或Message ,下面我们用一个简单的例子来描述。

//定义一个pg 

progressDialog = ProgressDialog.show(this, null, "正在读取数据...", true,
    false);

//开启work线程,请求网络数据,一个很费时间的I/O操作,比如网络或文件读写等等。
  Thread thread = new Thread(new Runnable() {
   @Override
   public void run() {
    initializeData();
    uiHandler.sendEmptyMessage(0); // 下载完成后发送处理消息给Handler,更新主线程

   }
  });
  thread.start();

 

 

 
 private Handler uiHandler = new Handler() {

  public void handleMessage(Message msg) {

   Log.e(">>>>>Mhandler", "开始handleMessage");
   if (msg.what == 0) {
    buildContentView();
    progressDialog.dismiss();
   } else {
    Toast.makeText(LibNewsDetialActivity.this, "下载文件失败,请检查网络连接",
      Toast.LENGTH_SHORT).show();
   }

  }

 };

   

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有