转载android的handler机制实现原理分析

wust小吴 wust小吴     2022-08-01     273

关键词:

handler在安卓开发中是必须掌握的技术,但是很多人都是停留在使用阶段。使用起来很简单,就两个步骤,在主线程重写handler的handleMessage( )方法,在工作线程发送消息。但是,有没有人想过这种技术是怎么实现的呢?下面我们一起探讨下。

先上图,让大家好理解下handler机制:

技术分享
handler机制示例图

上面一共出现了几种类,ActivityThread,Handler,MessageQueue,Looper,msg(Message),对这些类作简要介绍:

ActivityThread:程序的启动入口,为什么要介绍这个类,是因为该类就是我们说的主线程,它对Looper进行操作的。

Handler:字面意思是操控者,该类有比较重要的地方,就是通过handler来发送消息(sendMessage)到MessageQueue和 操作控件的更新(handleMessage)。handler下面持有这MessageQueue和Looper的对象。

MessageQueue:字面意思是消息队列,就是封装Message类。对Message进行插入和取出操作。

Message:这个类是封装消息体并被发送到MessageQueue中的,给类是通过链表实现的,其好处方便MessageQueue的插入和取出操作。还有一些字段是(int what,Object obj,int arg1,int arg2)。what是用户定义的消息和代码,以便接收者(handler)知道这个是关于什么的。obj是用来传输任意对象的,arg1和arg2是用来传递一些简单的整数类型的。

下面,我们按照启动顺序来进行源码分析:

技术分享

从上面可以看出,ActivityThread类是用来启动Android的,其源码为:

技术分享
ActivityThread类:

接下来,我们看到Looper类了,我们进去看看里面的源码实现:

首先,我们看看里面有哪些字段:

技术分享 Looper的内部属性

然后我们迫不及待地要想去看看prepareMainLooper方法,到底干了什么

技术分享

Looper.prepareMainLooper()方法

这里我们可以看到,prepareMainLooper是为了设置一个持有消息队列和消息序列器的Looper进去ThreadLocal。接下来我们看看loop方法吧:

技术分享

Looper.loop()方法

我们可以看到loop方法中,会取出内部的消息序列器,并且迭代里面的消息,根据消息的target分发消息(到handleMessage方法中)。如果你有疑问,你应该是不清楚Looper的MessageQueue为什么会有Message。那么我们就马上去看,到底是哪里添加消息的。话说,到了这里我也好像没有分析到和我们handler相关的操作吧。因为你和我都知道handler的作用是sendMessage和handleMessage,所以我们知道,Looper中的消息序列器的消息体,肯定是从sendMessage中添加进去的。不墨迹,我们马上进入Handler的源码分析。

首先,我们先看看Handler的字段:

技术分享

Handler的字段

接着,我们看看Handler的构造方法,我们可以看到,Handler有两类构造方法(别看到6个,它们都是往这两种方法调用的):

技术分享

Handler的构造方法

接着,我们要进入Handler.dispatchMessage()方法,因为我们要解释上面刚刚Looper.loop方法。dispatchMessage的方法很简单,只有三个方向,其源码为:

技术分享

Handler.dispatchMessage()方法

到这里为止,执行代码就结束了。那么问题来了,消息从哪里来的?带着这个疑问,我们马上进入Handler.sendMessage()逻辑去看看,其源码是:

技术分享

Handler.sendMessage()方法

好不容易找到了发送消息的逻辑并理解了,但是还要去壳,在MessageQueue中分析了,首先,我们回顾下,消息序列器是在Looper.prepare()中初始化的。MessageQueue源码,构造方法很简单:

技术分享

MessageQueue构造方法

然后我们再到达MessageQueue.enqueueMessage()方法中看源码:

技术分享

MessageQueue.enqueueMessage()方法

这个是发送消息的最终执行代码,就是把消息放进消息序列器。在Looper.loop()方法中,我们是需要不断从消息序列器中取出消息的。其过程也是我们可以进去MessageQueue.next()的源码中看看:

技术分享

MessageQueue.next()方法

这样,整个过程就完成了。在这些执行过程中,Message是它们的物件。我们可以看看Message的结构:

技术分享

Message的字段

除此之外,Message的数据结构是基于链表的,方法都很简单的,我就不贴出来了。

总结一下,其实就是用一个ThreadLocal来存储对象,然后在执行的时候,能够保证对象的不变形,这样就能达到在主先线程更新UI了。

handler机制.源码分析

Handler机制的原理:Android提供了handler和looper来满足线程之间的通信Handler是先进先出的原则一个线程可以产生一个looper对象,由它去管理线程里面消息队列MessageQueueHandler你可以构造handler对象来与looper沟通.可以发送消息和处理消息&nb... 查看详情

android:安卓学习笔记之handler机制的简单理解和使用(代码片段)

AndroidHandler机制的简单理解和使用Handler机制1、Handler使用的引出2、背景和定义3、作用和意义4、主要参数5、工作原理及流程5.1、对应关系6、深入分析Handler机制源码6.1、Handler机制的核心类6.2、核心方法6.3、方式1:使用Handler.s... 查看详情

android进阶知识——android的消息机制(代码片段)

文章目录1.Android的消息机制概述2.Android的消息机制分析2.1ThreadLocal的工作原理2.2消息队列的工作原理2.3Looper的工作原理2.4Handler的工作原理3.主线程的消息循环从开发的角度来说,Handler是Android消息机制的上层接口,这使得... 查看详情

android进阶知识——android的消息机制(代码片段)

文章目录1.Android的消息机制概述2.Android的消息机制分析2.1ThreadLocal的工作原理2.2消息队列的工作原理2.3Looper的工作原理2.4Handler的工作原理3.主线程的消息循环从开发的角度来说,Handler是Android消息机制的上层接口,这使得... 查看详情

handler机制原理分析(适合初学者)1.0

...息队列MessageQueue.并执行Looper.loop().     Handler消息机制的原理是什么了?我们先来写一个程序看看。  查看详情

handler系列之原理分析

...我们来学习一下Handler的工作原理吧!!!  我们知道Android中我们只能在ui线程(主线程)更新ui信息,那么你们知道为什么只能通过Handler机制更新ui吗?其实最根本的目的就是解决多线程并发的问题。  假设在一个Activity中有... 查看详情

[android进阶handler机制原理解析

mQueue=mLooper.mQueue;//通过Looper对象获取消息队列mCallback=callback;mAsynchronous=async;//获取Looper对象publicfinalLoopergetLooper()returnmLooper;从Handler的构造函数中我们可以发现,Handler在初始化的同时会通过Looper.getLooper()获取一个Looper... 查看详情

android多线程分析之三:handler,looper的实现(代码片段)

Android多线程分析之三:Handler,Looper的实现罗朝辉(http://blog.csdn.net/kesalin)CC许可,转载请注明出处在前文《Android多线程分析之二:Thread的实现》中已经详细分析了AndroidThread是如何创建,运行以及销毁的,其... 查看详情

handler机制和原理-android(代码片段)

handler主要包含Looper,MessageQueue,Message和Handler。Looper:它在消息机制里是用来把普通线程转成looper线程的(Looper.prepare()),并担当消息循环的任务,当然,UI线程是通过Looper.PrepareMainLooper()。它会开启 查看详情

android的handler基本原理源码分析(代码片段)

一、前言学习Android基础知识,都离不开handler,最开始最基础的使用从Handler.post去发送一个消息,Android系统的设计中,为了保证UI渲染的一致性(本质上线程并发问题)和无卡顿体验。耗时的操作需要放在工作线程中... 查看详情

android的handler基本原理源码分析(代码片段)

一、前言学习Android基础知识,都离不开handler,最开始最基础的使用从Handler.post去发送一个消息,Android系统的设计中,为了保证UI渲染的一致性(本质上线程并发问题)和无卡顿体验。耗时的操作需要放在工作线程中... 查看详情

android的handler基本原理源码分析(代码片段)

一、前言学习Android基础知识,都离不开handler,最开始最基础的使用从Handler.post去发送一个消息,Android系统的设计中,为了保证UI渲染的一致性(本质上线程并发问题)和无卡顿体验。耗时的操作需要放在工作线程中... 查看详情

深入源码分析handler的消息处理机制

学习Android的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群,群号码:364595326 我们一起学Android!  handler的消息处理有三个核心类:Looper,Handler和Message。其实还有一个Me... 查看详情

android进阶知识——android的消息机制(代码片段)

文章目录1.Android的消息机制概述2.Android的消息机制分析2.1ThreadLocal的工作原理2.2消息队列的工作原理2.3Looper的工作原理2.4Handler的工作原理3.主线程的消息循环从开发的角度来说,Handler是Android消息机制的上层接口,这使得... 查看详情

最新android大厂高频面试题解析大全

第一章Android相关1.Android进程间通信(IPC)机制Binder简要介绍和学习计划2.Activity的启动方式和flag详解3.Android源码分析-资源加载机制4.Android中Thread、Handler、Looper、MessageQueue的原理分析5.Android源码解析之setContentView6.AndroidAsyn... 查看详情

handler机制与原理

为什么会出现内存泄漏问题呢?分析Handler使用是用来进行线程间通信的,所以新开启的线程是会持有Handler引用的,如果在Activity等中创建Handler,并且是非静态内部类的形式,就有可能造成内存泄漏非静态内部... 查看详情

androidhandler消息机制从原理到应用详解(代码片段)

对于跨进程IPC通信,Android提供了一个完整的框架Binder,而对于线程之间的通信,Android同样提供了一个强大的消息机制:Handler/Looper/MessageQueue,通过Handler我们很容易的实现在UI线程与其他线程之间的消息传递。这篇... 查看详情

深入分析android-handler消息机制

参考技术AHandler是Android消息机制的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下,Handler的使用场景就是更新UI。在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI... 查看详情