Android中的Thread、Looper、Handler之间的关系
2014-03-13 16:46
393 查看
其实非常简单,只要搞清楚Thread、Looper、Handler它们各自的作用就OK了。
Thread 这个大家都知道就是线程,线程中包括一个消息队列(Message Queue),一个循环处理消息队列中消息的工具(Looper)。
Looper 这个可能有点陌生,就是Thread中的一个用来开启消息循环的工具,循环的取出Message Queue中的消息来让Thread执行。
Handler 这个可以看作是Looper的一个接口,具体怎么处理消息是在Handler中定义的(handleMessage()方法中定义)。
知道三者的含义那么就好说,剩下的就是怎么把它们给联系起来,由于Message Queue和Looper都是Thread自带的那么就不需要new出来,主要是Looper有点特殊,就是在使用Looper前必需 调用Looper.prepare()来初始化Thread的Looper,然后调用Looper.loop()来让Looper循环处理Message Queue中的消息(写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行)。但是怎么向Message
Queue中发送消息以及如何处理消息就需要我们自定义了,这就用到了 Handler ,Handler是与Looper绑定的。在调用了Looper.prepare()后,将Handler与Looper绑定就OK了。怎么绑定看下面:
首先明确一下,在android主线程(UI线程)也是一个线程,它里面也有Message Queue、Looper,只是android自动给主线程将Looper设置好了,那么要给主线程通讯我们只需要在主线程 new一个handler:
Handler mHandler = new Handler()//将主线程的Looper与handler绑定;
并且实现它里面的 handleMessage()方法即可(将消息发送给主线程)。
在这里没有看到Looper与Handler的绑定,其实在这个无参构造函数中 有这么句代码:
mLooper = Looper.myLooper();
无参构造函数直接取 当前所在线程的Looper,如果在子线程中没有执行Looper.prepare()方法就调用会报错,因为如果不执行Looper.prepare()方法,Looper还没有初始化。
下面看一个例子就全OK了(是两个子线程之间通信):
下面再看一个google的例子,是主线程与子线程通信的例子:
Thread 这个大家都知道就是线程,线程中包括一个消息队列(Message Queue),一个循环处理消息队列中消息的工具(Looper)。
Looper 这个可能有点陌生,就是Thread中的一个用来开启消息循环的工具,循环的取出Message Queue中的消息来让Thread执行。
Handler 这个可以看作是Looper的一个接口,具体怎么处理消息是在Handler中定义的(handleMessage()方法中定义)。
知道三者的含义那么就好说,剩下的就是怎么把它们给联系起来,由于Message Queue和Looper都是Thread自带的那么就不需要new出来,主要是Looper有点特殊,就是在使用Looper前必需 调用Looper.prepare()来初始化Thread的Looper,然后调用Looper.loop()来让Looper循环处理Message Queue中的消息(写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行)。但是怎么向Message
Queue中发送消息以及如何处理消息就需要我们自定义了,这就用到了 Handler ,Handler是与Looper绑定的。在调用了Looper.prepare()后,将Handler与Looper绑定就OK了。怎么绑定看下面:
首先明确一下,在android主线程(UI线程)也是一个线程,它里面也有Message Queue、Looper,只是android自动给主线程将Looper设置好了,那么要给主线程通讯我们只需要在主线程 new一个handler:
Handler mHandler = new Handler()//将主线程的Looper与handler绑定;
并且实现它里面的 handleMessage()方法即可(将消息发送给主线程)。
在这里没有看到Looper与Handler的绑定,其实在这个无参构造函数中 有这么句代码:
mLooper = Looper.myLooper();
无参构造函数直接取 当前所在线程的Looper,如果在子线程中没有执行Looper.prepare()方法就调用会报错,因为如果不执行Looper.prepare()方法,Looper还没有初始化。
下面看一个例子就全OK了(是两个子线程之间通信):
下面再看一个google的例子,是主线程与子线程通信的例子:
相关文章推荐
- Android笔记-MultiThreading in Android(1)-Thread,Looper,Handler,Message,MessageQueue之间的关系
- Android笔记-MultiThreading in Android(1)-Thread,Looper,Handler,Message,MessageQueue之间的关系
- Android笔记-MultiThreading in Android(1)-Thread,Looper,Handler,Message,MessageQueue之间的关系
- android的消息处理机制(图+源码分析)——Thread,Looper,MessageQueue,Message,Handler之间的关系
- Android中的Thread,MessageQueue,Looper,Message,Handler之间的关系图解
- Android面试题 请解释下单线程模型中Message、Handler、MessageQueue、Looper之间的关系
- Android 阅读源码,让你彻底理解Handler、Message、Looper之间的关系
- Message、Handler、Message Queue、Looper、Thread之间的关系(未完成)
- Android -- Looper、Handler、MessageQueue等类之间关系的序列图
- Android单线程模型中Message、Handler、Message Queue、Looper之间的关系---附实例源码
- 野人学Android第二弹——Handler与Thread之间的关系
- Android中Handler、Thread(HanlderThread)、Runnable之间的关系
- android中Thread、handler(Handler Thread)、Runnable之间的关系
- Android单线程模型中Message、Handler、Message Queue、Looper之间的关系---附实例源码
- android 多线程Thread,Runnable,Handler,AsyncTask等之间的关系
- Android--Handler+Looper+MessageQueue+Thread线程之间的通信
- Thread\Handler\Looper\MessageQueue之间的关系
- Android 理解Handler、Message、Looper之间的关系
- Android开发之单线程模型中Message、Handler、MessageQueue、Looper之间的关系
- Android应用开发多线程基础之Handler,Looper,Message,MessageQueue,Runnable之间的关系