免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1284 | 回复: 1
打印 上一主题 下一主题

Android UI主线程与子线程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-06 11:32 |只看该作者 |倒序浏览
Android UI主线程与子线程






多线程UIthread
       在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process。

       一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。
   
       在这么多Thread当中,有一个Thread,我们称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,我们认为,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行,以免阻塞主线程。


       那么,UI Thread如何和其他Thread一起工作呢?常用方法是:

       诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。


       例如,在子线程的状态发生变化时,我们需要更新UI。如果在子线程中直接更新UI,通常会抛出下面的异常:

ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.
      

       意思是,无法在子线程中更新UI。为此,我们需要通过Handler物件,通知主线程Ui Thread来更新界面。

       如下,首先创建一个Handler,来监听Message的事件:



Java代码
  1. private final int UPDATE_UI = 1;   
  2. private Handler mHandler = new MainHandler();   
  3.   
  4. private class MainHandler extends Handler {   
  5.    @Override  
  6.        public void handleMessage(Message msg) {   
  7.        switch (msg.what) {   
  8.            case UPDATE_UI: {   
  9.           Log.i("TTSDeamon", "UPDATE_UI");   
  10.           showTextView.setText(editText.getText().toString());   
  11.           ShowAnimation();   
  12.                break;   
  13.            }   
  14.            default:   
  15.                break;   
  16.        }   
  17.    }   
  18. }  

  19.       private final int UPDATE_UI = 1;
  20.       private Handler mHandler = new MainHandler();
  21.      
  22.       private class MainHandler extends Handler {
  23.          @Override
  24.              public void handleMessage(Message msg) {
  25.              switch (msg.what) {
  26.                  case UPDATE_UI: {
  27.                 Log.i("TTSDeamon", "UPDATE_UI");
  28.                 showTextView.setText(editText.getText().toString());
  29.                 ShowAnimation();
  30.                      break;
  31.                  }
  32.                  default:
  33.                      break;
  34.              }
  35.          }
  36.        }
复制代码
或者:

Java代码
  1. private Handler mHandler = new Handler(){   
  2.      @Override  
  3.          public void handleMessage(Message msg) {   
  4.          switch (msg.what) {   
  5.              case UPDATE_UI: {   
  6.             Log.i("TTSDeamon", "UPDATE_UI");   
  7.             showTextView.setText(editText.getText().toString());   
  8.             ShowAnimation();   
  9.                  break;   
  10.              }   
  11.              default:   
  12.                  break;   
  13.          }   
  14.       }   
  15.   }  

  16.     private Handler mHandler = new Handler(){
  17.          @Override
  18.              public void handleMessage(Message msg) {
  19.              switch (msg.what) {
  20.                  case UPDATE_UI: {
  21.                 Log.i("TTSDeamon", "UPDATE_UI");
  22.                 showTextView.setText(editText.getText().toString());
  23.                 ShowAnimation();
  24.                      break;
  25.                  }
  26.                  default:
  27.                      break;
复制代码
}
          }
      }




        当子线程的状态发生变化,则在子线程中发出Message,通知更新UI。

        mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);

   
        在我们的程序中,很多Callback方法有时候并不是运行在主线程当中的,所以如果在Callback方法中更新UI失败,也可以采用上面的方法。





转自:http://jinguo.iteye.com/blog/660073





论坛徽章:
0
2 [报告]
发表于 2012-03-11 22:58 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP