国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > 单线程模型中Message、Handler、MessageQueue、Looper之间的关系

单线程模型中Message、Handler、MessageQueue、Looper之间的关系

来源:程序员人生   发布时间:2014-12-19 08:23:41 阅读次数:2257次
Handler简介:
1个Handler允许你发送和处理MessageRunable对象,这些对象和1个线程的MessageQueue相干联。每个线程实例和1个单独的线程和该线程的MessageQueue相干联。当你创建1个新的Handler时,它就和创建它的线程绑定在1起了。这里,线程我们也能够理解为线程的MessageQueue。从这1点上来看,HandlerMessageRunable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责履行他们。

Handler有两个主要的用处:

1)肯定在将来的某个时间点履行1个或1些MessageRunnable对象。

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些信息,HandlerhanlerMessage(Message)会处理这些Message.固然,handlerMessage(Message)必须由Handler的子类来重写。这是编程人员需要作的事。

postingsending到1个Hanler时,你可以有3种行动:当MessageQueue准备好就处理,定义1个延迟时间,定义1个精确的时间去处理。后二者允许你实现timeout,tick,和基于时间的行动。

当你的利用创建1个新的进程时,主线程(也就是UI线程)自带1个MessageQueue,这个MessageQueue管理顶层的利用对象(像activities,broadcast receivers等)和主线程创建的窗体。你可以创建自己的线程,并通过1个Handler和主线程进行通讯。这和之前1样,通过postsendmessage来完成,差别在于在哪个线程中履行这么方法。在恰当的时候,给定的RunnableMessage将在HandlerMessageQueue中被Scheduled


Message
简介:
Message
类就是定义了1个信息,这个信息中包括1个描写符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和1个Object域,这可让你在大多数情况下不用作分配的动作。
虽然Message的构造函数是public的,但是获得Message实例的最好方法是调用Message.obtain(),Handler.obtainMessage()方法,这些方法会从回收对象池中获得1个。


MessageQueue
简介:
这是1个包括message列表的底层类。Looper负责分发这些messageMessages其实不是直接加到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(); } }

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生