Android Thread Looper Handler 关系

来源:互联网 发布:驾校模拟驾驶软件 编辑:程序博客网 时间:2024/04/29 10:37

Android经常用到Thread和Handler,其中还涉及到另一个于消息队列(MessageQueue)相关的类Looper。

今天在这里顺便把这几个类的定义和之间的关系打理一下。

 

 

先看源码中的注释

 

Thread,A Thread is a concurrent unit of execution
线程是一个并发的执行单位。

 

Looper,Class used to run a message loop for a thread.
维护线程的消息循环类。


Handler,A Handler allows you to send and process Message and Runnable
 objects associated with a thread's MessageQueue。
向消息队列发送消息(Runnable object),或者执行消息队列的消息(Runnable object).

 

这三者之间的关系:

一、Handler和Looper关系
区别:
两者都有MessageQueue打交道,但是Handler是向消息队列发送消息SendMessage(queue.enqueueMessage),而Looper是从取出消息(queue.next)。
联系:
1、Handler依赖Looper,每一个Handler必然有一个mLooper的成员变量。他的MessageQueue就是获取的Looper的消息队列,在构造函数中mQueue = looper.mQueue,即他们共享一个消息队列。
2、Looper取出消息在执行消息时候,实际上是运行的Handler的函数体。因为每一个Message类都有一个handler的参数(看Message定义)。
Looper在取出消息执行的时候,调用的就是这个Handler的HandleMessage()函数。

具体的步骤如下:Looper在Loop函数中,取出消息Message,然后调用该消息对应Handler的dispatchMessage函数,即Handler的handlerMessage函数。

二、Looper和Thread关系
Looper依赖Thread,Looper只是一个消息循环体,它空有一段代码。只有Looper的代码跑在Thread中,才是一个真正的消息循环。(这点如同学习操作系统的进程和函数差不多,其实也就是那么回事儿)

 

对于一个Android而言,每一个界面都有一个默认的Thread、消息循环体Looper和Handler。

调用new Handler()可以获得当前线程的Handler

调用Looper.myLooper()可以获得当前线程的Looper。

原创粉丝点击