转载请注明出处:http://blog.youkuaiyun.com/forevercbb/article/details/51295950
什么是Handler?
(翻译自Handler源码文档,英语渣,凑活看。英语好的可以看源文档。)
Handler允许你发送和处理Message,将Runnable对象和线程的MessageQueue相关联。每一个handler实例关联一个线程和线程的消息队列。当你创建一个新的Handler,它是绑定到创建它的线程以及消息队列中。从这一点上来看,它将传递消息和runnable对象,并且执行它们,因为它们来自消息队列。
Handler有两个主要的用途:1、安排消息和runable对象并且在将来的某个时间点执行它们。2、将一个行为放进队列,并将结果反馈到另一个线程中。
安排消息通过 post, postAtTime(Runnable, long), postDelayed, sendEmptyMessage, sendMessage, sendMessageAtTime, and sendMessageDelayed等方法实现。post允许将Runnable对象放入队列让接收到的消息队列进行调用。sendMessage允许你将一个Message对象放进消息队列,Message包含的bundle数据将在Handler的handleMessage方法中被处理。handleMessage的实现在Handler的子类中自定义。
当发送消息给Handler对象,你可以允许消息在消息队列就绪时立即被处理,或者指定一个延迟时间在它被处理之前,或者指定一个绝对的时间处理它。后面两种允许你实现超时、等待时间等基于时间的行为。
当你的应用创建一个进程,它的主线程运行一个消息队列,用来管理最高级别的应用对象,例如activities、broadcast receivers,和它们创建的任何windows。你可以创建你自己的线程,并通过Handler与应用的主线程进行交互。这依旧通过从你的新线程调用post或者senMessage方法实现。传递过来的Message和Runnable对象在消息队列中将在合适的时候被安排和执行。
Handler如何使用
Handler机制一般用来让子线程向主线程发送消息。大多用在子线程向主线程发送消息让主线程更新UI。
定义Handler类的子类,并实现handleMessage方法,在其中定义对消息的处理。
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
//针对不同的消息类型自定义处理
switch (msg.what) {
case XXX:
break;
default:
break;
}
}
}
实例化MyHandler类。一般在主线程。需要处理消息的线程。
private MyHandler mHandler = new MyHandler();
取得消息对象,设置消息对象的参数,并发送消息对象。一般在子线程,要通知或者给其它线程发送数据。
Message msg = mHandler.obtainMessage();
msg.what = tag;
msg.obj = info;
mHandler.sendMessage(msg);
另外可以根据需要选择其它方法,不难理解,不再赘述。
mHandler.sendMessageAtTime();
mHandler.sendMessageDelayed();
Message是什么
public final class Message implements Parcelable
Message是一个实现Parcelable接口的对象。Message的构造方法是公有的,但是一般情况下建议使用Message.obtainMessage()或者Handler.obtainMessage()方法从Message Pool中取得可循环的消息对象。Message的int成员变量what一般用来区分消息类型,每个Handler有自己的消息码的命名空间,因此不会和其它Handler有冲突。
arg1和arg2是低成本的,在消息只需要int值时,可以用arg1和arg2来替代setData()方法。
obj,obj是Object类型的对象,可以设置任意的非空的Parcelable对象。
也可以使用setData(Bundle data)给Message对象设置Bundle数据。
本文详细介绍了Android应用中Handler机制的原理、用途及使用方法,包括如何发送和处理消息,以及如何在不同线程间传递数据。重点阐述了Handler在安排消息、实现基于时间的行为、以及与主线程交互等方面的运用。
558

被折叠的 条评论
为什么被折叠?



