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

【Android】Only the original thread that created a view hierarchy can touch its views的处理

(2012-06-04 21:58:39)
标签:

android

handler

runnable

original

thread

it

分类: 工作随笔


今天在另外的一个工作线程中调用一个API,主要是想要弹出一个对话框,结果出现错误:Only the original thread that created a view hierarchy can touch its views!处理方法如下。

    首先我们需要明白,主线程或者这里说的原始线程original thread 一般情况下是UI线程,当然UI线程并不一定是主线程,我们不能长时间的阻塞该应用,在Android平台上可能会产生类似Force closeWait这样的对话框这里我们成为ANR,这里除了使用ProgressDialog方式给用一个动态的进度代表当前处理并没有中断可能需要一些时间,相关的网络处理可以使用工作线程,但是worker 线程不能处理显示元素即UI相关的ViewWidget包中的高层的控件,所以通过一个Handler对象可以很好的传递RunnableMessage 

 

  我想在线程中调用的api如下

  private void doNeedExit() {

              //弹出对话框时,隐藏进度条

              myProgressBar.setVisibility(4); // INVISIBLE

             

              StringBuffer sb = new StringBuffer();

               sb.append("频道不能播放!");

          

              Dialog dialog = new AlertDialog.Builder(PlayerActivity.this)

                      .setCancelable(false) //设置不响应回退(return)

                            .setTitle("提示")

                            .setIcon(android.R.drawable.ic_dialog_alert)

                            .setMessage(sb.toString())

                            // 设置内容

                            .setPositiveButton("退出",// 设置确定按钮

                                          new DialogInterface.OnClickListener() {

 

                                                 @Override

                                                 public void onClick(DialogInterface dialog,

                                                               int which) {

                                                        PlayerActivity.this.finish(); 

                                                 }

 

                                          }).create();// 创建

              // 显示对话框

              dialog.show();

       }

 

如果在工作线程里调用doNeedExit() 如下: (红色部分)

Thread PlayThread = new Thread(){

           public void run() {

                  System.out.printf("[PlayerActivity] PlayThread Run\n");

                  if(PlayUrl != null)

                  {

                         System.out.printf("[PlayerActivity] PlayUrl = [%s] \n" ,PlayUrl);

                   try {

                          //设置需要播放的视频

                          mediaPlayer.reset();

                             mediaPlayer.setDataSource(PlayUrl);

                          //把视频画面输出到SurfaceView

                          mediaPlayer.setDisplay(surfaceView.getHolder());

                          mediaPlayer.prepare();  

                          mediaPlayer.start();                    

                      } catch (IllegalArgumentException e) {

                             // TODO Auto-generated catch block

                             e.printStackTrace();

                      } catch (IllegalStateException e) {

                             // TODO Auto-generated catch block

                             e.printStackTrace();

                      } catch (IOException e) {

                             // TODO Auto-generated catch block

                             e.printStackTrace();

                                          

                  }

                  else

                  {

                         doNeedExit();

                  }

           }

    };

 

则会出现错误:

Only the original thread that created a view hierarchy can touch its views

 

处理方法如下:

//定义 UI handle runnable

       Handler myUIHandler = new Handler();

       Runnable mUpdateUI = new Runnable() {

             

              @Override

              public void run() {

                     // TODO Auto-generated method stub

                     UpdateUI();

              }

};

       // 实现UpdateUI API

private void UpdateUI() {

              //需要更新的UI

              System.out.printf("[UpdateUI] Run \n");

              doNeedExit();

      

 

最终在工作线程里如下调用:

       //doNeedExit();

       myUIHandler.post (mUpdateUI);

    错误就不会再出现了!

0

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

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

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

新浪公司 版权所有