学习Android Handler消息传递机制_安卓软件开发教程-查字典教程网
学习Android Handler消息传递机制
学习Android Handler消息传递机制
发布时间:2016-12-28 来源:查字典编辑
摘要:Android只允许UI线程修改Activity里的UI组件。当Android程序第一次启动时,Android会同时启动一条主线程(Main...

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

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

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新安卓软件开发学习
    热门安卓软件开发学习
    编程开发子分类