Handler,Message,Looper的关系

Android系统中,Java的应用程序和其他的系统相同,都是靠消息驱动工作的,大致的工作原理是:

有一个消息队列,可以往这个消息队列中投递消息。

有一个消息循环,不断从消息队列中取出消息,然后处理。

在Android系统中,这些工作主要是由Looper和Handler类来实现。

Looper类,用于封装消息循环,并且有一个消息队列。

Hanlder类,有点像辅助类,它封装消息投递,消息处理等接口。

Looper类分析

在线程中有一个线程局部变量类,调用Looper的prepare()方法,会在线程的局部变量类中设置一个Looper对象。这个Looper对象就保存在这个调用线程的TLV中。而Looper对象内部封装了一个消息队列。也就是说,prepare函数通过ThreadLocal机制,巧妙地把Looper和调用线程关联在一起了。

Looper循环

Looper类有一个myLooper()方法,调用这个方法,可以返回调用线程的线程局部

变量,也就是存储在其中的Looper对象   。

loop()函数内部的处理过程为:

1. 调用myLooper方法返回保存在调用线程TLV中的Looper对象。

2. 取出这个Looper的消息队列。

3. 处理消息,Message对象中有一个target,它是Handler类型。

4. 如果target为空,则表示需要退出消息循环,否则,调用该消息的Handler,交给它的dispatchMessage函数处理。

简单理解,Looper的作用是:

1. 封装一个消息队列。

2. Looper的prepare函数把这个Looper和调用prepare的线程(也就是最终的处理线程)绑定在一起了。

3. 处理线程调用loop函数,处理来自消息队列的消息。

当事件源向这个Looper发送消息的时候,其实是把消息加入到这个Looper的消息队列里面。那么该消息就将和Looper绑定的处理线程来处理。

Looper,Message和Handler的关系

Looper中有一个Message队列,里面存储的是一个个待处理的Message。

Message中有一个Handler,这个Handler是用来处理Message的。

Handler分析

Handler中的消息队列,实际上就是某个Looper中的消息队列。

如果不知道Handler,怎么往Looper的消息队列中插入消息。

1. 调用Looper的myQueue,它将返回一个消息队列对象MessageQueue。

2. 构造一个Message,填充它的成员,尤其是target变量。

3. 调用MessageQueue的enqueueMessage,将消息插入消息队列。

Handler和Message

Handler提供了一系列函数帮助我们完成创建消息和插入消息队列的工作。

用Handler处理消息时,Handler把Message的target设为自己,是因为Handler除了封装消息添加等功能外还封装了消息处理的接口。

Handler的消息处理

往Looper的消息队列里添加一个消息后,按照Looper的处理机制,它在获得消息后会调用target的dispatchMessage函数,再把这个消息派发给Handler处理。

dispatchMessage定义了一套消息处理的优先级机制

1. Message如果自带了callback处理,则交给callback处理。

2. Handler如果设置了全局的mCallback,则交给mCallback处理。

如果上述都没有,则该消息会被交给Handler子类实现的handleMessage来处理。当然,这需要从Handler派生并重载handleMessage函数。

Looper和Handler的同步关系

在一个线程中创建Looper,在另一个线程中去取这个Looper的值,可能Looper还没来得及创建,这个时候去取,则会得到null值。

这个问题可以通过使用HandlerThread来解决。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 07:15:09

Handler,Message,Looper的关系的相关文章

Android开发之Handler和Looper的关系

关于Handler的总结. Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等. MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行.当然,存放Message并非实际意义的保存,而

从Handler+Message+Looper源码带你分析Android系统的消息处理机制

引言 [转载请注明出处:从Handler+Message+Looper源码带你分析Android系统的消息处理机制 CSDN 废墟的树] 作为Android开发者,相信很多人都使用过Android的Handler类来处理异步任务.那么Handler类是怎么构成一个异步任务处理机制的呢?这篇 博客带你从源码分析Android的消息循环处理机制,便于深入的理解. 这里不得不从"一个Bug引发的思考"开始研究Android的消息循环处理机制.说来话长,在某一次的项目中,原本打算开启一个工作线

Android 之异步任务(AsyncTask,Handler,Message,looper)

AsyncTask: 3个类型(Params,Progress和Result),4个步骤(onPreExecute(),doInBackground(Params…),onProgressUpdate(Progress…), onPostExecute(Result) ) Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理. 首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异

handler与looper的关系及HandlerThread

做了也快2年的android了,发现android的机制还不是很了解,这几天看了一下这方面的介绍,总结一下handler的用法和机制. handler就是用来线程之间通信的,主线程与子线程.一般的用法是,子线程通知ui主线程的handler去刷新ui操作.最近遇到一些人,问能不能主线程去通知子线程的handler. 当然是可以的.贴一个例子 package cc.c; import android.app.Activity; import android.os.Bundle; import an

Android Handler处理机制 ( 二 ) ——Handler,Message,Looper,MessageQueue

Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取出消息后要对消息进行处理:Handler 平时我们最常使用的就是Message与Handler了,如果使用过HandlerThread或者自己实现类似HandlerThread的东 西可能还会接触到Looper,而MessageQueue是Looper内部使用的,对于标准的SDK,我们是无法实例化并

Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue

在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中 提供收到消息后相应的处理方法即可,这里不对handler使用进行详细说明,在看本博文前,读者应该先掌握handler的基本使用,我这里主要深入描述handler的内部机制 .现在我们首先就有一个问题,我们使用myThread

从Handler+Message+Looper源代码带你分析Android系统的消息处理机制

PS一句:不得不说CSDN同步做的非常烂.还得我花了近1个小时恢复这篇博客. 引言 [转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 作为Android开发人员,相信非常多人都使用过Android的Handler类来处理异步任务. 那么Handler类是怎么构成一个异步任务处理机制的呢?这篇 博客带你从源代码分析Android的消息循环处理机制.便于深入的理解. 这里不得不从"一个Bug引发的思考"開始研究Android的消息

Handler,Looper,Message,MessageQueue之间关系浅析

一.先看一下使用流程 1.在子线程中使用Handler实例 /***********子线程使用Handler实例*********/ private class LooperThread extends Thread { public Handler handler; @Override public void run() { Looper.prepare(); handler = new Handler() { @Override public void handleMessage(Messa

android的handler、looper、Message之间的关系

handler:绑定到一个线程上,一个线程可以有多个handler looper:线程跟looper是一一对应的,所以looper不能被调用两次否则会抛出异常 messge:handler利用message来携带消息 messagQueue:用来状态message,一个looper对应一个消息队列 如何来判断一个消息队列对应一个handler呢,在sendmessage中获取到一个消息队列的持有者looper looper的两个方法:prepare()和loop() 1. public stat