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这个注释说开来,
继续说明消息是怎么取的
消息的入对列也是单向列表式的操作
现在你开朗了吗?。。。。。。
分享到:
相关推荐
Handler 在 MessageQueue 中以任务形式排队,Looper 在任务出现时执行它们 MessageQueue. Looper 使线程保持活动状态,循环 MessageQueue 并向相应 Handler 的进程发送消息。 Thread 通过调用 Looper 的 quit() ...
一说到Android的消息机制,自然就会联想到Handler,我们知道Handler是Android消息机制的上层接口,因此我们在开发过程中也只需要和Handler交互即可,很多人认为Handler的作用就是更新UI,这也确实没错,但除了更新UI...
我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们常见的用法是这样吧? 一般我们比较少接触MessageQueue, 其实它内部的IdleHandler接口有很多有趣的...
,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及...
5.Looper:消息循环,从MessageQueue中取出Message进行处理; 6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息循环线程. 在Android开发中经常会使用到线程,一想到线程,一般都会想到: new ...
关联篇:深入Android的消息机制源码详解-Handler,MessageQueue与Looper关系 关联篇:Handler内存泄漏及其解决方案 本篇我们将来给大家介绍HandlerThread这个类,以前我们在使用线程执行一个耗时任务时总会new一个...
XHandler XHandler,handler的正确使用姿势与消息传递机制多线程和任务运行是老话题。 Java本身具有java.util.concurrent包和Fork / Join框架来简化它。... 处理程序使用Looper将任务排队到MessageQueue中,并在任
Android Handler 执行绪...每一个执行绪都可以有一个讯息伫列(Message Queue)和一个循环器(Looper),在Android中建立的UI执行绪具有讯息伫列和一个循环器,其它worker执行绪预设并没有(可使用HandlerThread产生具有讯息
积分管理系统java源码 ...Android线程 为什么要同步 Android中使用多线程的方法 裸new一个Thread(失控线程,不推荐) ...Android线程模型就是消息循环,Looper关联MessageQueue,不断尝试从MessageQueue取出Message来
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...
因此,没有使用Looper和MessageQueue 。 我们要读取传感器数据的每个线程上都需要一个新的Handler 。 HandlerThread必须将消息发布到这些线程中的每个线程。 现在,我们仅从UI线程读取数据。 想象一下,我们在UI...
MessageQueue;Looper;HandlerThread。 下面看一段在线程中更新UI的代码: 代码如下:public class MainActivity extends Activity {private TextView timeLable;private Button stopBtn;private Thread mThread;...