Handler——简介和用法
Handler中常用的四个方法:
sendMessage(Message msg)
sendMessageDelayed(Message msg, long delayMillis)
post(Runnable r)
postDelayed(Runnable r, long delayMillis)Handler中的message queue和javascript中的event queue的机制是一样的。
handler中post传入的Runnable对象中的run方法其实是在UI线程(主线程)中被执行的,这个就是使用了Handler的第二个作用:将action传入到message queue中,然后使得action被别的线程所执行。
Handler handler = new Handler(); // 创建Handler对象
通过Handler在自定义的子线程中更新UI,否则会抛出异常的。我们可以自己在UI线程之上再创建线程,然后我们需要通过Handler来使得我们的线程和UI线程通信。这样我们才能在我们的子线程中更新UI。因为Android中UI的更新只能在UI线程中进行。我们只能通过Handler的通信来使得我们从子线程中更新UI。
从上面的介绍我们知道,一个Handler实例其实绑定了一个关联的thread线程和那个线程的message queue;handler会讲message和runnable对象发送到它所关联的message queue中去,同时它也会执行从message queue中出来的message和runnable。
Handler的两大用途:1. 在未来某个时间点执行message和runnable对象;2. 将要执行的action放到message queue中去,然后使得另外的不同的线程可以执行这个action。
使用Handler的sendMessage()和handleMessage()
- handleMessage()
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
mTextView.setText("" + msg.arg1);
};
};
主线程中新建一个Thread发送message给主线程。
new Thread() {
public void run() {
Message message = handler.obtainMessage();
message.arg1 = 88;
handler.sendMessage(message);
};
}.start();
- 移除runnable对象
对应于handler.postDelayed(myRunnable, 2000);
直接handler.removeCallbacks(myRunnable); - 截获message
在创建handler对象时,调用new Handler(Callback callback)方法。
private Handler handler = new Handler(new Callback() {
public boolean handleMessage(Message msg) {
return true; //return true就截获,return false不截获
}
}){
public void handleMessage(Message msg) {
}
};
在主线程中执行handler.sendEmptyMessage(1)。其原理:
当Handler收到message时,新创建的Callback将首先执行,其handleMessage()将会处理消息;如果Callback的handleMessage()不截获消息,然后Handler才可能会收到消息。Handler的Callback用法。如果return true,则说明message被截获,下面的handleMesage方法将不会被执行。
1、使用Handler在子线程中向ui线程发送一个消息进行UI的更新;
2、创建一个Message; Message msg = new Message(); msg.arg1=88;
3、handler.sendMessage(msg); // 最终导致同一个handler对象的handleMessage()方法被创建Handler对象的线程(一般在主线程中创建)回调,然会这个传入的msg会被当成参数传给handleMessage()方法的。这个时候我们就可以对Message对象做一些处理了,而且这个时候我们所处的线程一般就在UI线程中了,所以这个时候我们更新UI就没有问题了。
msg.obj=xxx; 可以传递一个对象;
4、复用系统的message对象 Message msg = handler.obtainMessage(); // or Message.obtain();
msg.sendtoTarget(); 也可以发送到Handler对Message进行处理
handler.removeCallbacks(Runnable r);
如前面所说,我们除了在Handler对象的handleMessage()方法中处理Message对象,还可以在Handler对象创建的时候传入一个Callback对象,用这个Callback对象来处理Message对象;注意:callback接口中handleMessage(Message msg)中若截获则一定返回true;