欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

学习Android Handler消息传递机制

程序员文章站 2024-03-31 19:21:16
android只允许ui线程修改activity里的ui组件。当android程序第一次启动时,android会同时启动一条主线程(main thread),主线程主要负责...

android只允许ui线程修改activity里的ui组件。当android程序第一次启动时,android会同时启动一条主线程(main thread),主线程主要负责处理与ui相关的事件,如用户的按键事件、屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以,主线程通常又被称为ui线程。 

android只允许ui线程修改activity里的ui组件,这样会导致新启动的线程无法动态改变界面组件的属性值。但在实际的android程序开发中,尤其是涉及动画的游戏开发中,需要让新启动的线程周期性的改变界面组件的属性值,这就需要借助于handler的消息传递机制来实现了。 

1 handler类简介 
handler类的主要作用有两个: 
(1)在新启动的线程中发送消息 
sendmessage(message msg)  或者 
sendemptymessage(int what)   
两者的差异,请看android源码: 

public final boolean sendmessage(message msg) 
{ 
return sendmessagedelayed(msg, 0); 
} 
public final boolean sendemptymessage(int what)
{ 
return sendemptymessagedelayed(what, 0);
 
} 

再看sendemptymessagedelayed(what, 0)的源码: 

public final boolean sendemptymessagedelayed(int what, long delaymillis) 
{ 
message msg = message.obtain();
msg.what = what; 
return sendmessagedelayed(msg, delaymillis); 
}

 其实,sendmessage(message msg)  和sendemptymessage(int what)  实际上是一样的,一个传message类型的msg,一个传int类型的what,传what的,最终会转为msg。 

(2)在主线程中获取、处理消息
 public void handlemessage(message msg) 

2 使用实例 
下面使用handler以及timer类实现时间的自动刷新

public class mainactivity extends activity {
 
 @override
 protected void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.activity_main);
 final textview txt=(textview)findviewbyid(r.id.showtime);
 final handler myhandler=new handler()
 {
  @override
  public void handlemessage(message msg)
  {
  if(msg.what==0x12)
  {

   txt.settext("当前时间:"+new java.util.date());

  }
  }
 };
 button btn=(button)findviewbyid(r.id.btn);
 btn.setonclicklistener(new onclicklistener() {
  @override
  public void onclick(view arg0) {
  // todo auto-generated method stub

  new timer().schedule(new timertask() {
  @override
   public void run() {
   // todo auto-generated method stub

   myhandler.sendemptymessage(0x12);
   }
  }, 0,1000);  
  }
 });

 }
 

 @override
 public boolean oncreateoptionsmenu(menu menu) {
 // inflate the menu; this adds items to the action bar if it is present.
 getmenuinflater().inflate(r.menu.main, menu);
 return true;
 }
 

} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。