今天介绍一下Android的消息传递机制Handler,Handler是另一种形式的“事件处理”,这种机制主要是为了解决Android应用的多线程问题---Android平台不允许Activity新启动的线程访问该Activity里的界面组件,这样就会导致新启动的线程无法动态改变界面组件的属性值。
Handler类主要有两个作用:
在新启动的线程中发送消息;
在主线程中获取、处理消息。
Handler类包含如下方法用于发送、处理消息:
void handlerMessage(Message msg):处理消息的方法,该方法通常用于被重写。
final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息。
final boolean hasMessage(int what,Object object):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。
多个重载的Message obtainMessage():获取消息。
sendEmptyMessage(int what):发送空消息。
final boolean sendEmptyMessageDelayed(int what,long delayMillis):指定多少毫秒之后发送空消息。
final boolean sendMessage(Message msg):立即发送消息。
final boolean sendMessageDelayed(Message msg,long delayMillis):指定多少毫秒之后发送消息。
下面看个实例,该实例通过一个新线程来周期性地修改ImageView所显示的图片,直接上代码:
1 public class HandlerTest extends Activity 2 { 3 //定义周期性显示的图片的ID 4 int[] imageIds = new int[] 5 { 6 R.drawable.java, 7 R.drawable.ee, 8 R.drawable.ajax, 9 R.drawable.xml, 10 R.drawable.classic 11 }; 12 int currentImageId = 0; 13 @Override 14 public void onCreate(Bundle savedInstanceState) 15 { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.main); 18 final ImageView show = (ImageView)findViewById(R.id.show); 19 final Handler myHandler = new Handler() 20 { 21 @Override 22 public void handleMessage(Message msg) 23 { 24 //如果该消息是本程序所发送的 25 if (msg.what == 0x1233) 26 { 27 //动态地修改所显示的图片 28 show.setImageResource(imageIds[currentImageId++]); 29 if (currentImageId >= 4) 30 { 31 currentImageId = 0; 32 } 33 } 34 } 35 }; 36 //定义一个计时器,让该计时器周期性地执行指定任务 37 new Timer().schedule(new TimerTask() 38 { 39 @Override 40 public void run() 41 { 42 //新启动的线程无法访问该Activity里的组件 43 //所以需要通过Handler发送信息 44 Message msg = new Message(); 45 msg.what = 0x1233; 46 //发送消息 47 myHandler.sendMessage(msg); 48 } 49 }, 0 , 800); 50 } 51 }