学习Android Handler消息传递机制
Android只允许UI线程修改Activity里的UI组件。当Android程序第一次启动时,Android会同时启动一条主线程(MainThread),主线程主要负责处理与UI相关的事件,如用户的按键事件、屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以,主线程通常又被称为UI线程。
Android只允许UI线程修改Activity里的UI组件,这样会导致新启动的线程无法动态改变界面组件的属性值。但在实际的Android程序开发中,尤其是涉及动画的游戏开发中,需要让新启动的线程周期性的改变界面组件的属性值,这就需要借助于Handler的消息传递机制来实现了。
1Handler类简介
Handler类的主要作用有两个:
(1)在新启动的线程中发送消息
sendMessage(Messagemsg) 或者
sendEmptyMessage(intwhat)
两者的差异,请看Android源码:
publicfinalbooleansendMessage(Messagemsg)
{
returnsendMessageDelayed(msg,0);
}
publicfinalbooleansendEmptyMessage(intwhat)
{
returnsendEmptyMessageDelayed(what,0);
}
再看sendEmptyMessageDelayed(what,0)的源码:
publicfinalbooleansendEmptyMessageDelayed(intwhat,longdelayMillis)
{
Messagemsg=Message.obtain();
msg.what=what;
returnsendMessageDelayed(msg,delayMillis);
}
其实,sendMessage(Messagemsg) 和sendEmptyMessage(intwhat) 实际上是一样的,一个传Message类型的msg,一个传int类型的what,传what的,最终会转为msg。
(2)在主线程中获取、处理消息
publicvoidhandleMessage(Messagemsg)
2使用实例
下面使用Handler以及Timer类实现时间的自动刷新
publicclassMainActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
finalTextViewtxt=(TextView)findViewById(R.id.showTime);
finalHandlermyHandler=newHandler()
{
@Override
publicvoidhandleMessage(Messagemsg)
{
if(msg.what==0x12)
{
txt.setText("当前时间:"+newjava.util.Date());
}
}
};
Buttonbtn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewarg0){
//TODOAuto-generatedmethodstub
newTimer().schedule(newTimerTask(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
myHandler.sendEmptyMessage(0x12);
}
},0,1000);
}
});
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。