`
zhangziyangup
  • 浏览: 1075461 次
文章分类
社区版块
存档分类
最新评论

android Looper HandlerThread MessageQueue Handler Message(完善中......)

 
阅读更多


ActivityThread.java 的 main主函数启动入口

Looper.java

从prepareMainLooper方法的注释可以理解,初始化当期线程,而looper和一个线程关联,并且提供了主线程looper对象的对外接口

初始化当前线程,之后把一个初始化的Looper关联线程,在Looper初始化的时候做了一些操作就是初始化了一个消息队列MessageQueue即通过Looper来管理MessageQueue,通过调用Looper.myLooper()可以获得当前线程的Looper对象,但是Looper的构造函数是私有的,外界无法直接实例化之;要实例化,只有通过Looper::prepare()


looper里面的消息队列进行循环机制,执行消息队列里面的一个个消息,注意msg.target是个Handler对象

轮循中开始处理系统的一个个消息,两种情况一种正常消息处理,一种回掉处理;其中

handleMessage(msg)为需要用户自己继承Handler来覆盖此方法作为用户需要执行的任务。


理解下HandlerThread,你会发现HandlerThread继承Thread,HandlerThread::run()里面调用了Looper的初始化prepare();和looper()。



理解Handler,从下面的Handler构造函数可以了解Handler的构造是需要Looper对象的,没有参数Looper的构造函数是用当前线程的looper对象;而当然你也可以通过HandlerThread施行run后就有了looper对象,通过对外的接口getLooper()可以获取此Looper对象,MessageQueue在looper中是一个属性,所以你需要记忆这个。


说明:对于以上的理解我在最后会有实例来验证说明,到这里我们的疑问是现在我们想知道 消息是怎么封装的,消息是怎么放入消息队列的?

消息的入消息队列


通过上面的理解,用实例来验证上面的理解,下面是我以前项目中写的代码。

实例一:在一个activity耗时的操作方法中自己起了一个线程


实例二:Service中,这里注意下,Message的对象创建Message::obtain(),这个对象也可以是Handler的obtainMessage()来创建。



从上面我写的代码可以看到发送有两种方式,sendMessage(m)和postDelayed(r)两种,我列出源码

下班了,。。。。。。上面是一个流程的了解,下面我们需要对细节的了解,这个有待继续。

下面是message的创建,请注意这里,先从池中取出,需要明白下面是个单向链表的形式,从注释中可以了解到:// sometimes we store linked lists of these things
Message next;如果在池中没有就从新new一个对象。


注意message要是用完后,需要回收放入池中



从// might block这个注释说开来,

继续说明消息是怎么取的


消息的入对列也是单向列表式的操作


现在你开朗了吗?。。。。。。







  


  
分享到:
评论

相关推荐

    了解Android核心:Looper,Handler和HandlerThread

    Handler 在 MessageQueue 中以任务形式排队,Looper 在任务出现时执行它们 MessageQueue. Looper 使线程保持活动状态,循环 MessageQueue 并向相应 Handler 的进程发送消息。 Thread 通过调用 Looper 的 quit() ...

    深入Android Handler,MessageQueue与Looper关系

    一说到Android的消息机制,自然就会联想到Handler,我们知道Handler是Android消息机制的上层接口,因此我们在开发过程中也只需要和Handler交互即可,很多人认为Handler的作用就是更新UI,这也确实没错,但除了更新UI...

    详细分析android的MessageQueue.IdleHandler

    我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们常见的用法是这样吧? 一般我们比较少接触MessageQueue, 其实它内部的IdleHandler接口有很多有趣的...

    Thread、Handler和HandlerThread关系详解

    ,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及...

    Android App在线程中创建handler的方法讲解

    5.Looper:消息循环,从MessageQueue中取出Message进行处理; 6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息循环线程. 在Android开发中经常会使用到线程,一想到线程,一般都会想到: new ...

    深入Android HandlerThread 使用及其源码完全解析

    关联篇:深入Android的消息机制源码详解-Handler,MessageQueue与Looper关系 关联篇:Handler内存泄漏及其解决方案 本篇我们将来给大家介绍HandlerThread这个类,以前我们在使用线程执行一个耗时任务时总会new一个...

    XHandler:XHandler, handler的正确使用姿势与消息传递机制

    XHandler XHandler,handler的正确使用姿势与消息传递机制多线程和任务运行是老话题。 Java本身具有java.util.concurrent包和Fork / Join框架来简化它。... 处理程序使用Looper将任务排队到MessageQueue中,并在任

    Android_Studio_Handler:Android Handler 执行绪教学

    Android Handler 执行绪...每一个执行绪都可以有一个讯息伫列(Message Queue)和一个循环器(Looper),在Android中建立的UI执行绪具有讯息伫列和一个循环器,其它worker执行绪预设并没有(可使用HandlerThread产生具有讯息

    积分管理系统java源码-alibaba-Interview-preparation:阿里巴巴实习生面试个人准备

    积分管理系统java源码 ...Android线程 为什么要同步 Android中使用多线程的方法 裸new一个Thread(失控线程,不推荐) ...Android线程模型就是消息循环,Looper关联MessageQueue,不断尝试从MessageQueue取出Message来

    Android开发案例驱动教程 配套代码

    8.4.2 Message和MessageQueue 169 8.4.3 Handler 169 8.4.4 Looper和HandlerThread 172 本章小结 178 第9章 Activity和Intent 179 9.1 Activity 179 9.1.1 创建Activity 179 9.1.2 Activity生命周期 180 9.2...

    android-thread-producer-consumer-example:线程之间的ProducerConsumer模型示例

    因此,没有使用Looper和MessageQueue 。 我们要读取传感器数据的每个线程上都需要一个新的Handler 。 HandlerThread必须将消息发布到这些线程中的每个线程。 现在,我们仅从UI线程读取数据。 想象一下,我们在UI...

    android使用多线程更新ui示例分享

    MessageQueue;Looper;HandlerThread。 下面看一段在线程中更新UI的代码: 代码如下:public class MainActivity extends Activity {private TextView timeLable;private Button stopBtn;private Thread mThread;...

Global site tag (gtag.js) - Google Analytics