Handler Looper MessageQueue

Android Handler机制-Looper、Handler、MessageQueue、Message的关系 一、概述 Handler是Android中处理异步消息的机制。Looper、Handler、MessageQueue、Message概括来说就是:Looper负责的就是创建一个MessageQueue,然后进入一个无限循环体不断从该MessageQueue中读取消息Message,然后回调相应的消息处理函数,而消息的创建者就是一个或多个Handler,执行完成一个消息后则继续循环。 二、MessageQueue详解 消息队列MessageQueue就是存放消息的队列。那队列中存储的消息是什么呢?. 阅读详情

本篇博客介绍Handler与Looper的关系,可能大家都有用过Handler实现跨线程的通信(比如子线程处理完耗时,使用handler发送消息给主线程进行UI更新操作),但是里面的原理大家都清楚吗?本篇博客将和大家一起了解里面的机制。


Handler

我们首先来看下api的介绍
A Handler allows you to send and process {@link Message} and Runnable objects associated with a thread’s {@link MessageQueue}. Each Handler instance is associated with a single thread and that thread’s message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it – from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.

There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.
简单翻译下:Handler可以让我们把Message或者Runnable对象发送到与之关联的消息队列中,每个Handler实例都与单一的线程,以及该线程的消息队列对应。当你创建一个Handler的时候,它就与该线程/创建它的线程中的消息队列进行绑定。从这点来说,它可以传递 message和runnable到消息队列,然后在消息队列中执行任务。
上面加粗部分的介绍,可能是我因为不过关,我总觉得描述的不够准确,后面会有例子说明这点。

Looper

Looper的设计使用了ThreadLocal, 保证了每个线程最多只能有一个对应的looper,通过Looper.prepare(),可以为当前线程绑定一个looper。Looper中持有一个messageQueue, handler发送的消息都会进到这个messageQueue里,然后进行执行。 handler里发送任务的最终的执行线程,就是looper所绑定的线程。

我们直接上测试代码吧

    Looper looperThread1;
    private void testHandle() {
        new Thread(new Runnable(){
            @Override
            public void run() {
                         Log.d("Tag",
                         Thread.currentThread()+"Looper.prepare");
                Looper.prepare();
                looperThread1 = Looper.myLooper();
                Looper.loop();
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.d("Tag", Thread.currentThread()+"Create Handler");
                Handler handler = new Handler(looperThread1);
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Log.d("Tag", Thread.currentThread()+"handle runnable");
                    }
                });
            }
        }).start();

    }

运行的结果是:

D/Tag: Thread[Thread-146,5,main]Looper.prepare
D/Tag: Thread[Thread-147,5,main]Create Handler
D/Tag: Thread[Thread-146,5,main]handle runnable

这段代码证明了,Handler中发送的message或runnable对象,最终执行的时候,并非一定是在 Handler的创建线程,而是在创建Handler时,在构造方法里传入的 looper所在的线程,只是我们调用无参构造方法时,默认用的是当前线程looper.

如果大家还有不理解的地方可以可以再看看源码,或者留言一起学习讨论。

Handler、Message、MessageQueue、Looper协作简析 Handler、Message、MessageQueue、Looper工作过程简析。 阅读详情

相关推荐

Android并发编程之Handler,MessageQueue,Looper详解

Handler和Looper,MessageQueue之间是什么关系? Looper和MessageQueue是线程中的概念,但是线程默认是没有Looper和MessageQueue的,我们需要手动去设置他们,当一个线程有了Looper和MessageQueue后,就可以关联一个Handler,我们再通过这个Handler,就可以从别的线程中发送消息给这个线程来执行。 我们给一个线程配置了Lo

阿拉灯神灯的专栏 2900

Android源码解析——Handler、Looper与MessageQueue

代表的是消息队列中的第一条消息,如果 mMessages 为空,说明消息队列是空的,或者 mMessages 的触发时间要比新消息晚,则将新消息插入消息队列的头部;如果 mMessages 不为空,则寻找消息列队中第一条触发时间比新消息晚的非空消息,并将新消息插到该消息前面。方法是一个无限循环的方法,如果消息队列中没有消息,则该方法会一直阻塞,当有新消息来的时候。//如果消息队列是空的或者队列中第一条的消息的触发时间要比新消息长,则将新消息作为链表头部。

2401_89317591的博客 1089

Frida实战:SSL Pinning绕过技术全解析

本文详细解析了如何使用Frida工具绕过SSL Pinning技术,包括环境搭建、四种实战绕过方案及常见问题排查指南。通过具体代码示例和实战经验,帮助安全研究人员快速掌握SSL Pinning绕过技术,适用于金融类App的安全测试场景。

weixin_42530732的博客 188

Handler、MessageQueue、Looper底层原理梳理(详解)

本文深入分析了Android消息处理机制的核心组件:Handler、Looper、Message和MessageQueue的工作原理及相互关系。详细列举了安卓源码,对理解安卓的通信机制有重要意义。解释的非常详细,非常适合刚入门的小伙伴。

appron的博客 1344

MT4/MT5数据源接入全攻略:从买服务、自研API到低成本DDE,哪种方案适合你?

本文全面解析MT4/MT5数据源接入的三种主流方案:商业服务、自研API和低成本DDE,详细对比其技术参数、成本结构和适用场景。帮助技术团队根据业务需求选择最优方案,确保外汇交易系统的数据流稳定性和实时性,提升交易体验和业务连续性。

weixin_42568801的博客 173

正点原子lwIP实战指南——从FreeRTOS移植到网络应用开发

本文详细介绍了如何将轻量级TCP/IP协议栈lwIP移植到FreeRTOS实时操作系统上,并基于正点原子STM32开发板进行网络应用开发。内容涵盖从使用STM32CubeMX快速搭建工程、核心概念解析(RAW/NETCONN/Socket API),到关键的系统适配、驱动实现,并通过TCP Echo服务器和云台控制两个实战案例,手把手指导读者完成从移植到应用开发的全过程,帮助嵌入式开发者快速掌握lwIP在FreeRTOS环境下的稳定部署与开发技巧。

s4t5u6v的博客 1000

Handler、Looper、MessageQueue的关系

在日常开发中我们经常用到Handler,用来处理、传递消息而Handler中内部怎么实现,它与Looper、MessageQueue到底有什么关系确说不上来。 先看下大体流程图: MessageQueue内部维护了一个Message的队列,我们通过Handler将消息Message发送到Looper中的MessageQueue,通过不断循环的Looper从MessageQueue中取出消息进...

qq_34715930的博客 265

thinkcmf 代码执行 (CVE-2019-7580) 漏洞复现

所有文章,仅供安全研究与学习之用,后果自负! thinkcmf 代码执行 CVE-2019-7580thinkcmf 代码执行 (CVE-2019-7580)0x01 漏洞描述0x02 影响范围0x03 漏洞复现3.1 登录后台3.2 漏洞利用3.2.1webshell3.2 phpinfo3.3 获取系统命令0x04 漏洞修复 thinkcmf 代码执行 (CVE-2019-7580) 复现小心会搞崩环境。 0x01 漏洞描述 ThinkCMF是一款支持Swoole的开源内容管理框架(CMF),基于Thi

YouthBelief的博客 4264

Handler,Looper,MessageQueue

结论:一个线程可以有多个Handler,只有一个Looper,只有一个MessageQueue。多个Handler共用一个Looper和一个MessageQueue。一个应用中可以有多个Handler,多个Looper,多个MessageQueue。 一个线程可以有多个Handler 这个很好理解,你在Activity中,new 多少个Handler都不会出问题,而且每个Handler都有sen...

songshizhuyuan的专栏 801

Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法

使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。

fydar的博客 3503

使用Python与OpenCV实现基于霍夫变换的圆形缺陷检测与定位详细教程

本文详细探讨了如何使用Python和OpenCV库,通过图像边缘检测和霍夫变换实现圆形对象的检测与缺陷定位。我们不仅介绍了算法的基本原理,还通过具体的代码示例展示了如何在实际应用中实现这些技术。对于工业检测和医学影像分析,本文的方法提供了高效且易于实现的解决方案。随着图像处理技术的不断发展,未来我们可以期待更多新算法和新技术的应用,如深度学习与传统方法的结合,以及多传感器融合技术的引入,这将进一步提升缺陷检测与定位的效率和准确性。

qq_38334677的博客 1296

Handler,Looper,MessageQueue的工作原理

功能划分Handler的使用必须与几个组件一起。*Message: Handler接收和处理的消息对象,类似于一个业务类,封装了一些变量。 *MessageQueue:一个队列容器,采用先进先出的原则管理Message。程序创建Looper对象的时候会在构造函数中创建MessageQueue对象。 *Looper:负责管理MessageQueue和Message对象,读取到MessageQu

初心 1704

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,

KJ.JK 1074

深入理解Handler、Looper、Messagequeue

上一篇总结了一下Handler的基本用法,但是对于其原理并不太清楚,这篇主要分析下其内部的原理。 1 Handler会用到Looper、Message、MessageQueue。 2 Looper Looper用于为线程运行消息循环的类,默认线程没有与它们相关联的消息循环;需要在线程中调用prepare(),创建消息循环。然后通过loop()方法来循环处理消息,直到循环结束。 欢迎使用

奋斗的菜鸟ing 5592

android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。试着改小一下minSdkVersion 为23重新编译apk,再检测一下签名版本v1居然打开了!参考网上搜索到的方法,手动在build.gradle里面添加。但是编译出来的apk还是只有v2的签名。里面提到了v1签名还和。

hedalei的博客 466

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android多线程之图解Handler Looper MessageQueue Message

Android中的多线程可以有多种实现方式,前面我们已经讲过了封装程度较高异步任务(AnsyncTask),这一节我们来看看较为灵活的方式:Handler Looper MessageQueue Message。 Message:用于线程之间传递信息,发送的消息放入目标线程的MessageQueue中。 MessageQueue:用于简化线程之间的消息传递,MessageQueue接受发送端的Message,并作为消息处理端的输入源。每个线程只有一个实例。 Handler:用于处理Message。根据业务

oracleot的专栏 7142

老版QQ原生表情gif动态

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

Handler Looper MessageQueue Message

工作流程: Handler 将Message 发送至MessageQueue 消息队列,然后Looper从MessqgeQueue中取出消息发送给Handler, Handler在处理Message 对象和Runnable对象。 主线程创建一个Looper looper.prepare() public static final void prepare() { if (sThreadL...

qq_35957672的博客 239

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

Looper、MessageQueue、Handler三者关系理解

1.Looper有两个关键的放perpare(),loop()方法,在prepare方法会创建一个Looper对象,然后保存在ThreadLocal中,该方法只能被调用一次,否则会抛出异常,这样保证了一个线程只有一个looper,Looper构造器中创建MessageQueue对象 public static final void prepare() {           if

charles674611395的专栏 1641

Android Handler,MessageQueue,Looper源码解析

本文主要针对Handler机制原理进行源码分析,如果对Android的Handler机制不熟悉的可以查看Android Handler机制。 总结来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制。那这种机制如果仅仅通过一个Handler是无法完成任务的,还需要Looper、MessageQueue、Thread等的协作才能完成这一整套的异步消息循环处理机制。这...

红日 955

线程通信:Handler、MessageQueue和Looper

Android 消息机制:Handler、MessageQueue 和 Looper在这篇文章中,我们将会讨论 Android 的

夜游神 1538

Handler, MessageQueue, Runnable与Looper

相信不少人对这几个概念深恶痛绝,因为它们“像雾像雨又像风”——自我感觉都很熟识,如果下一次再相遇,却又陌生得很。这种“隔靴搔痒”的感觉促使我们必须与这些“顽固分子”来个彻底的决断。 先不要想太多,任头脑中随意画下对这些概念的第一印象,如图5-5所示。 ▲图5 5 概念初探 图5-5是我们对这几个概念的“感官”释义,读者可以尝试着思考下是否和自己所想的基本一致。 那么,如果把这些概念糅

林学森的技术专栏 3981

Handler、Looper和MessageQueue

本文主要讲的内容是:Handler、Looper和MessageQueue 的关系和它们是如何一起工作的。1、为什么哪里都能看到的 Handler?Handler 到底是什么?2、为什么在 Activity 中调用 Handler.post(Runnable r) 时,可以保证 r 的 run 方法中的内容会在 UI线程 中执行?

sirenyizhi的博客 407

Handler Looper MessageQueue

Handler主要用于线程之间的消息通信,发送消息时,消息会进入Handler的消息队列(MessageQueue),之后发送消息的线程会继续执行,Handler所在的线程会通过Looper将消息逐一取出并处理 Handler所属的线程必须要有一个Looper去处理消息,系统会自动为主线程创建一个Looper用来处理消息,但是在我们自己创建的子线程中由于没有Looper,会导致调用new Hand...

weixin_46576403的博客 221

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

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

gitblog_00318的博客 664
上一篇: Android Binder通信机制浅析
kkdev
博客等级 码龄11年 1粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值