当前位置: 移动技术网 > IT编程>移动开发>Android > 学习Android Handler消息传递机制

学习Android Handler消息传递机制

2019年07月24日  | 移动技术网IT编程  | 我要评论

逍遥游下载,可爱背景图片,恋物论坛

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;
 }
 

} 

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网