您的位置:首页 > 移动开发 > Android开发

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的例子,是主线程与子线程通信的例子:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐