前言
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得;
Handler消息传递机制
出于性能优化考虑,Android的UI操作并不是线程安全的,这意义着如果有多个线程并发操作UI组件,则可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件。在实际开发中,需要让新启动的线程周期性地改变界面组件的属性值,这就需要借助于Handler的消息传递机制来实现了。
Handler类简介
Handler类的主要作用有两个。
- 在新启动的线程中发送消息。
- 在主线程中获取、处理消息。
Handler类的功能看似简单,似乎只要在新启动的线程中发送消息,在主线程中获取、处理消息。但这个过程涉及两个问题:新启动的线程何时发送消息呢?主线程何时去获取并处理消息呢?
为了让主线程能在适当的时机处理新启动的线程所发送的消息,显然只能通过回调的方式来实现——需要重写Handler类中处理消息的方法。
Handler类包含如下方法用于发送、处理消息。
- void handleMessage(Message msg):处理消息的方法。通常被重写。
- final boolean hasMessages(int what):检查消息队列是否包含what属性为指定值的消息。
- final boolean hasMessages(int what, Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。
- sendEmptyMessage(int what):发送空消息。
- final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定多少秒后发送空消息。
- final boolean sendMessage(Message msg):立即发送消息。
- final boolean sendMessageDelayed(Message msg,long delayMillis)
本实例将通过一个新线程来周期性地修改ImageView所显示的图片,自动播放图片还可以使用ViewFlipper和AdapterViewFlipper组件来实现。
代码示例
MainActivity.java
public class MainActivity extends Activity { // 定义周期性显示的图片ID int[] imageIds = new int[] { R.drawable.baxianhua, R.drawable.dengta, R.drawable.juhua, R.drawable.kaola, R.drawable.qie, R.drawable.shamo, R.drawable.shuimo, R.drawable.yujinx }; int currentImageId = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handler); final ImageView show = (ImageView) findViewById(R.id.image); final Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.what == 0x123) { //动态地修改所显示的图片 show.setImageResource(imageIds[currentImageId++ % imageIds.length]); } } }; //定义一个计时器,让该计时器周期性地执行指定任务 new Timer().schedule(new TimerTask() { @Override public void run() { //发送空消息 myHandler.sendEmptyMessage(0x123); } }, 0, 1200);//1.2秒更改一次 }
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。