学习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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。