您当前位置:
首页 >
php开源 >
综合技术 > 单线程模型中Message、Handler、MessageQueue、Looper之间的关系
单线程模型中Message、Handler、MessageQueue、Looper之间的关系
来源:程序员人生 发布时间:2014-12-19 08:23:41 阅读次数:2314次
Handler简介:
1个Handler允许你发送和处理Message和Runable对象,这些对象和1个线程的MessageQueue相干联。每个线程实例和1个单独的线程和该线程的MessageQueue相干联。当你创建1个新的Handler时,它就和创建它的线程绑定在1起了。这里,线程我们也能够理解为线程的MessageQueue。从这1点上来看,Handler把Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责履行他们。
Handler有两个主要的用处:
(1)肯定在将来的某个时间点履行1个或1些Message和Runnable对象。
(2)在其他线程(不是Handler绑定线程)中排入1些要履行的动作。
Scheduling Message,即(1),可以通过以下方法完成:
post(Runnable):Runnable在handler绑定的线程上履行,也就是说不创建新线程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post这个动作让你把Runnable对象排入MessageQueue,MessageQueue遭到这些消息的时候履行他们,固然以1定的排序。sendMessage这个动作允许你把Message对象排成队列,这些Message对象包括1些信息,Handler的hanlerMessage(Message)会处理这些Message.固然,handlerMessage(Message)必须由Handler的子类来重写。这是编程人员需要作的事。
当posting或sending到1个Hanler时,你可以有3种行动:当MessageQueue准备好就处理,定义1个延迟时间,定义1个精确的时间去处理。后二者允许你实现timeout,tick,和基于时间的行动。
当你的利用创建1个新的进程时,主线程(也就是UI线程)自带1个MessageQueue,这个MessageQueue管理顶层的利用对象(像activities,broadcast
receivers等)和主线程创建的窗体。你可以创建自己的线程,并通过1个Handler和主线程进行通讯。这和之前1样,通过post和sendmessage来完成,差别在于在哪个线程中履行这么方法。在恰当的时候,给定的Runnable和Message将在Handler的MessageQueue中被Scheduled。
Message简介:
Message类就是定义了1个信息,这个信息中包括1个描写符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和1个Object域,这可让你在大多数情况下不用作分配的动作。
虽然Message的构造函数是public的,但是获得Message实例的最好方法是调用Message.obtain(),或Handler.obtainMessage()方法,这些方法会从回收对象池中获得1个。
MessageQueue简介:
这是1个包括message列表的底层类。Looper负责分发这些message。Messages其实不是直接加到1个MessageQueue中,而是通过MessageQueue.IdleHandler关联到Looper。
你可以通过Looper.myQueue()从当前线程中获得MessageQueue。
Looper简介:
Looper类被用来履行1个线程中的message循环。默许情况,没有1个消息循环关联到线程。在线程中调用prepare()创建1个Looper,然后用loop()来处理messages,直到循环终止。
大多数和message loop的交互是通过Handler。
下面是1个典型的带有Looper的线程实现。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public voidhandleMessage(Message msg) {
// process incomingmessages here
}
};
Looper.loop();
}
}
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
------分隔线----------------------------
------分隔线----------------------------