从源码中深入学习Handler,HandlerThread,MessageQueue,Looper。

Android源码剖析:基于-Handler、Looper-实现拦截全局崩溃 跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。本文在开源项目:【 阅读详情

权利声明:转载请注明出处:http://blog.youkuaiyun.com/hello_chillax/article/details/44986895

今天在写项目时用到了HandlerThread,就顺便把Handler,MessageQueue,Looper都顺便复习整理了一下,写成博客,与大家分享,由于自己水平有限,难免理解的有些浅薄,有什么不合适或者不懂的地方欢迎留言询问,咱们一起探讨。
如果是对Handler一点都不了解的朋友,可以参考我的另一篇博客Handler:搭建UIThread&WorkerThread之间通信的桥梁
好了,下面我们进入正题。
HandlerThread其实就是一个Thread,只不过它初始化了相应的MessageQueue和Looper。这里听不懂没关系,我们继续往下看。

我们知道,如果是Handler,它初始化MessageQueue和Looper对象的方法是(下面的代码是需要用户写的)

new Thread(new Runable()){
    @Override
    public void run() {
    new Handler(){
        @Override
        public void handleMessage(Message msg) {
            Looper.prepare();
            ......    //处理消息的代码
            Looper.loop();
        }
    }
    }
}

而HandlerThread的run方法呢,是源码中写好的

public class HandlerThread extends Thread {
    int mPriority;     //线程优先级
    int mTid = -1;     //线程的ID
    Looper mLooper;    //该线程对应的Looper对象

    public HandlerThread(String name) {  //name  该线程的名字
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }
    //HandlerThread的另一个构造函数
     public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;
    }
    //下面是该线程的run()方法
    @Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();   
//重点:HandlerThread的run()方法调用了looper.prepare()方法,初始
//化了Looper和MessageQueue,至于为什么,下面再讲解
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();       
//重点:HandlerThread的run()方法调用了looper.loop()方法,建立了消  
//息队列的循环
        mTid = -1;
    }
}

总结一下,就是HandlerThread比Handler+Thread的方式更方便,因为它自己已经初始化好了Looper和MessageQueue,用户直接调用handler.obtainMeaasge()发送消息,用handler.handleMessage()出息消息就行了,而且不用重写(Override)run()方法。

下面说一下为何通过Looper.prepare()可以初始化Looper和MessageQueue,还是让我们从源码中找答案。

先看怎样创建的Looper对象。

public static void prepare() {
        prepare(true);
    }
//我们可以看到,调用Looper.prepare()方法后直接调用了prepare(true)
//方法,而在该方法中很明显,new Looper(quitAllowed)新创建了一个
//Looper对象,
    private static void prepare(boolean quitAllowed) {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper(quitAllowed));//创建Looper对象
    }
    再看怎样初始化的MessageQueue。
 private Looper(boolean quitAllowed) {
        mQueue = new MessageQueue(quitAllowed);//重点:这里新创建了一个MessageQueue。
        mRun = true;
        mThread = Thread.currentThread();
    }

细心的朋友可能会问,Handler,Looper,MessageQueue是怎样绑定在一起的呢,我这里贴一下Looper类的几个成员变量,大家就明白了。

 private static final String TAG = "Looper";

    // sThreadLocal.get() will return null unless you've called prepare().
    static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
    private static Looper sMainLooper;  // guarded by Looper.class

    final MessageQueue mQueue;   //Looper对象的MessageQueue
    final Thread mThread;        //Looper对象的Thread
    volatile boolean mRun;       

    private Printer mLogging;

至于怎样绑定Handler对象,看了HandlerThread的用法,就一目了然了,下面讲解HandlerThread的基本用法。

handlerThread=new HandlerThread("HandlerThreadName->Login");
handlerThread.start();
handler(handlerThread.getLooper());
handler=new Handler(handlerThread.getLooper()){//怎么样,绑定了吧,这是HandlerThread的最基本的用法,网上基本都是讲的这个。
        @Override
        public void handleMessage(Message msg) {
        }
}

**下面让我们进行一下最后的总结:
1.HandlerThread=MessageQueue+Looper+Thread
2.HandlerThread+Handler=MessageQueue+Looper+Thread+Handler
3.对于一个Thread,对应着一个唯一的MessageQueue,唯一的Looper,一个或者多个Handler对象。**
好了,想必大家已经明白的差不多了吧,由于本人水平实在有限,只能讲到这样了,有什么不明白的欢迎留言询问,大家一起探讨,今天就到这里了,再见。

Android之Handler、Message、MessageQueue、Looper详解 阅读详情

相关推荐

【汽车ECU标定技术解析】DCM文件与A2L、HEX的协同工作机制

本文深入解析了汽车ECU标定中DCM、A2L与HEX三大核心文件的协同工作机制。A2L文件作为定义标定变量地址与规则的“图纸”,DCM文件承载工程师调试后的具体标定数据,最终通过A2L的地址映射,将DCM数据固化生成可刷入ECU的HEX文件,形成完整的标定数据流转闭环。

weixin_29214559的博客 437

android中handler中 obtainmessge与New message区别

obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new new需要重新申请,效率低,obtianmessage可以循环利用; //use Handler.obtainMessage(),instead of msg = new Message(); //because if there is already an Message object,that not be

少爷 1万+

麒麟 ARMv10 SP3 安装 Oracle 19c 官方文档 或 教程

在麒麟ARMv10 SP3系统上安装Oracle 19c需要特别注意架构兼容性。

qq_43032338的博客 2941

Android Looper和Handler

Android中的Looper , Handler , Message Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。 Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessag

Hknock的专栏 1577

《网络安全自学教程》- Nmap使用及扫描原理分析

使用Nmap进行端口扫描、主机发现、服务识别、操作系统识别、指定脚本、结果导出文件,使用wireshark抓包分析扫描原理。

wangyuxiang946的博客 1万+

嵌入式工程师成长之路(1)——元件基础(试读版)

上拉电阻阻值选错导致MCU反复重启?0欧电阻竟然能“背锅”信号干扰?高精密采样电阻的温漂毁了整个控制系统?——这些问题,都是基础不牢!优快云硬件领域头部博主十年经验汇总,涵盖电阻分类、封装、实战选型、避坑指南,附带职业进阶路径,助你从小白进阶为“电路医生”!

云轩阁 34万+

浅析Handler、Looper机制。通过自定义Handler、Looper,让你有更直观的了观!

转载请注明出处:http://blog.csdn.net/liu470368500/article/details/40625333 Handler、Looper。面试的时候被问到的机率非常高的一个问题。当然。我说的是像我们这样的初级。。。一般讲解Handler、Looper机制的都是通过源码去讲解。这里我来通过自定义Handler、Looper。让各位看官能有个更直观的了解。相信有了这篇博文的

_小豪的专栏 3480

Vision 机器视觉案例 之 零件边缘缺陷检测

缺陷检测工具

机器视觉李小白的博客 1386

InterviewQuestion实战:Handler、Looper、MessageQueue源码解析

在Android开发中,Handler、Looper、MessageQueue构成了核心的异步消息处理机制,是保证UI线程不阻塞、实现组件间通信的关键。本文将从实战角度解析这三者的工作原理及源码实现,帮助开发者深入理解Android消息循环机制。 ## 一、Handler机制核心组件关系 Handler机制主要由**Handler**、**Looper**、**MessageQueue**和*

gitblog_00318的博客 664

使用C/C++复制图像

要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。函数将输出图像保存到文件中。在这个示例中,我们假设输入图像是一个常见的JPEG图像,文件名为"input.jpg"。

CyberWarpX的博客 729

《QGIS快速入门与应用基础》161:面要素顶点编辑与形状调整

本文系统讲解了QGIS中面要素顶点编辑与形状调整的核心操作。首先明确了顶点编辑的适用场景与核心概念,强调需满足图层类型、编辑模式、要素选择等六大前提。详细介绍了编辑顶点工具(F2键)的激活路径及配套辅助工具,通过耕地地块修正案例,分步骤演示顶点移动、添加(双击/工具栏)、删除(Delete键)三大基础操作。同时提供捕捉工具开启、画布缩放等实用技巧,帮助用户高效完成面要素的精细化调整,解决实际工作中的形状偏差问题。全文图文结合,步骤清晰,适合GIS新手快速掌握面要素编辑的核心技能。

LuckyHanMo的博客 485

Android HandlerThread、Looper、MessageQueue 源码分析

在Android开发中,大家应该对有一定了解。顾名思义,是Thread的一个子类。与普通的Thread不同,Thread 通常一次只能执行一个后台任务,如果需要执行多个任务,就必须创建多个线程,这样容易导致资源管理复杂,甚至可能出现内存泄漏等问题。而有一个显著的特点,它能够串行地执行多个任务。每个任务通过消息的形式排队执行,线程池中的任务按顺序依次处理,无需手动管理线程的生命周期或调度过程。我们只需通过 Handler 将任务发送到中,它会自动按顺序执行,极大简化了开发过程。使用。

WeiPR的博客 1035

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

weixin_42412049的博客 1515

Handler、Looper、MessageQueue、HandlerThread、ActivityThread、Message源码分析

一、Handler、Looper、MessageQueue、HandlerThread、ActivityThread、Message结构 1、Message:消息;其中包含了消息ID,消息对象以及处理的数据等,由MessageQueue统一列队管理,终由Handler处理 2、MessageQueue:消息队列;用来存放Handler发送过来的消息,并按照FIFO(先入先出队列)规则执行。当然...

chenhande1990chenhan的专栏 480

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android消息机制完全指南:Handler、Looper、MessageQueue源码解析

Android消息机制是Android开发的核心基础,其中Handler、Looper和MessageQueue三者构成了线程间通信的基石。无论是UI更新、异步任务处理还是系统组件交互,都依赖于这套高效的消息循环系统。本指南将从基本概念到源码实现,全面解析Android消息机制的工作原理,帮助开发者深入理解其内部运作机制。 ## 一、Android消息机制核心组件 Android消息机制主要由

gitblog_00410的博客 459

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android Looper Handler 机制浅析

最近想写个播放器demo,里面要用到 Looper Handler,看了很多资料都没能理解透彻,于是决定自己看看相关的源码,并在此记录心得体会,希望能够帮助到有需要的人。本文会以猜想 + log验证的方式来学习 Android Looper Handler,对于一些复杂的代码会进行跳过,能够理解它们的设计原理即可。本文观点皆个人拙见,如有错误恳请赐教。

青山渺渺 3304

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【温故而知新】Android 消息机制/HandlerThread、Looper、Handler 在Java层的知识点

Android 消息机制的实现主要类有Looper、HandlerThread、Handler、Message、MessageQueue,但在使用过程中我们会发现明显Hander与Message提供的方法非常之多,Looper与MessageQueue等类提供的接口确很少,另外还特别提供了一个HandlerThread这个开箱即用的类(HandlerThread = Thread + Looper 模型的默认实现)来尽可能的方便我们使用消息机制。其实我们去看MessageQueue类的源码会发现它的方法是

技术的学习与积累是个技术活 2385

理解Android Hander、Looper、Message 、MessageQueue、HandlerThread

这几个类经常用到,以前理清后就再未管过,现在突然又迷糊了,现在又理清了,今天做个记录,以后不清楚了看看就清楚了。有2篇文章写得非常好,我就不贴源码分析了,Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系http://blog.csdn.net/lmj623565791/article/details/38377229 点击打开链接【从源码...

Alex老夫子的专栏 707

HandlerThread原理、使用实例、源码详细解析

0、目录 一、HandlerThread简介 二、HandlerThread原理 三、HandlerThread使用实例 四、HandlerThread源码分析 五、总结 一、HandlerThread简介 HandlerThread是一个轻量级的异步类,可以实现多线程,并且可以实现线程间的通信(HandlerThread主要应用是实现主线程到子线程的通信,子线程到主线程通信可以通过...

haovin的博客 5979

Handler Looper Messagequeue Message 细节以及关系

前两天和朋友看 lunchar模块其中的一个问题, 引发了我还是要写一下这个兴趣,网上太多了先看下 handler public class Handler extends ObjectA Handler allows you to send and process Message and Runnable objects associated with a thread’s Message

1120

Android Handler、Looper、HandlerThread及Message源码解析

读前须知         本文是对Android Handler源码的解析,对Handler的基本使用还不了解的朋友可以先快速学习一下Handler再来阅读本文。 Handler创建 最直接的创建方法就是不带参数new一个Handler对象了。 Handler handler = new Handler(); //H...

PYJTLK的博客 453

一个线程可以有几个Looper?几个Handler?从Looper.prepare()来看看关于Looper的一些问题

前言 之前我有篇文章里面写到了Android的消息机制,Handler发送消息的一些原理。链接如下: 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露) 在消息机制里面,有一个非常重要的东西,那就是Looper,Looper的作用主要是从消息队列里面取出消息交给Handler处理,不过不仅限于此,在这里面还有很多东西值得我们去...

梦里梦到醒不来的梦 1万+

【Android】Handler工作原理 && HandlerThread用法

Handler在多线程通信,Handler通过Message、MessageQueue、Looper和Handler四大组件实现线程间通信,为解决线程重复启动问题,HandlerThread封装了Looper.prepare()和Looper.loop()逻辑,使单个线程可处理多个任务。HandlerThread如何在不同线程间传递任务结果,并分析了其内部synchronized同步机制保证线程安全的原理。最终实现后台线程执行耗时任务后,通过主线程Handler更新UI的效果。

阿华的博客 1302

android Handler , Looper , Message , MessageQueue 详解

android Handler , Looper , Message , MessageQueue 详解

maoning20080808的专栏 455

Handler,Looper,MessageQueue,Message 原理

前置知识 1.Thread的run方法和start方法区别 直接调用run方法,run中的内容并不会另起一个线程运行,只有调用start方法才可以 2.ThreadLocal ThreadLocal 的get方法会获得 Threadlocal在相应线程set的值。 --------------------------------------------------------------...

perfectnihil的博客 248
下一篇: synchronized静态代码块,以及其中的wait,notify和notifyAll
肖小的人儿
博客等级 码龄12年 29粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值