Android Looper和Handler分析

Android之Handler、Message、MessageQueue、Looper详解 阅读详情
 第一次接触android应用程序(这里指的是JAVA层的UI程序,也难怪了,Google放出的API就只支持JAVA应用程序了),很难搞明白内部是如何实现的。但是,从原理上分析,应该是有一个消息循环,一个消息队列,然后主线程不断得从消息队列中取得消息并处理之。

然而,google封装得太厉害了,所以一时半会还是搞不清楚到底是怎么做的。本文将分析android内的looper,这个是用来封装消息循环和消息队列的一个类,handler其实可以看做是一个工具类,用来向消息队列中插入消息的。好比是Windows API的SendMessage中的HANDLE,这个handle是窗口句柄。

那怎么往这个消息队列中发送消息呢??调用looper的static函数myQueue可以获得消息队列,这样你就可用自己往里边插入消息了。不过这种方法比较麻烦,这个时候handler类就发挥作用了。先来看看handler的代码,就明白了。

  1. class Handler{  
  2. ..........  
  3.   
  4. public Handler() {  
  5.   
  6.         if (FIND_POTENTIAL_LEAKS) {  
  7.             final Class<? extends Handler> klass = getClass();  
  8.             if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&  
  9.                     (klass.getModifiers() & Modifier.STATIC) == 0) {  
  10.                 Log.w(TAG, "The following Handler class should be static or leaks might occur: " +  
  11.                     klass.getCanonicalName());  
  12.             }  
  13.         }  
  14.   
  15.   
  16.         mLooper = Looper.myLooper();  
  17.         if (mLooper == null) {  
  18.             throw new RuntimeException(  
  19.                 "Can't create handler inside thread that has not called Looper.prepare()");  
  20.         }  
  21.   
  22.   
  23.         mQueue = mLooper.mQueue;  
  24.         mCallback = null;  
  25.     }  
  26.   
  27.   
  28.     public Handler(Looper looper) {  
  29.         mLooper = looper;  
  30.         mQueue = looper.mQueue;  
  31.         mCallback = null;  
  32.     }  
  33.   
  34.   
  35.   
  36. public Handler(Looper looper, Callback callback) {  
  37.         mLooper = looper;  
  38.         mQueue = looper.mQueue;  
  39.         mCallback = callback;  
  40.     }  
  41.   
  42.   
  43.   
  44. public final boolean sendMessage(Message msg)  
  45.     {  
  46.         return sendMessageDelayed(msg, 0);  
  47.     }  
  48.   
  49.   
  50. public final boolean sendMessageDelayed(Message msg, long delayMillis)  
  51.     {  
  52.         if (delayMillis < 0) {  
  53.             delayMillis = 0;  
  54.         }  
  55.         return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);  
  56.     }  
  57.   
  58.   
  59. public boolean sendMessageAtTime(Message msg, long uptimeMillis)  
  60.     {  
  61.         boolean sent = false;  
  62.         MessageQueue queue = mQueue;  
  63.         if (queue != null) {  
  64.   
  65.   
  66.             msg.target = this;  
  67.             sent = queue.enqueueMessage(msg, uptimeMillis);  
  68.         }  
  69.         else {  
  70.             RuntimeException e = new RuntimeException(  
  71.                 this + " sendMessageAtTime() called with no mQueue");  
  72.             Log.w("Looper", e.getMessage(), e);  
  73.         }  
  74.         return sent;  
  75.     }  
  76.   
  77.   
  78.   
  79.   
  80.   
  81. public void dispatchMessage(Message msg) {  
  82.   
  83.         if (msg.callback != null) {  
  84.             handleCallback(msg);  
  85.         } else {  
  86.   
  87.           if (mCallback != null) {  
  88.                 if (mCallback.handleMessage(msg)) {  
  89.                     return;  
  90.                 }  
  91.            }  
  92.   
  93.             handleMessage(msg);  
  94.         }  
  95.     }  
  96. ..........  
  97. }  

 讲了这么多,该怎么创建和使用一个带消息循环的线程呢?

  1.   
  2.   
  3. ....  
  4.   
  5. ... onCreate(...){  
  6.   
  7.   
  8.   
  9.   
  10. class ThreadWithMessageHandle extends Thread{  
  11.     
  12.   Looper myLooper = null;  
  13.   run(){  
  14.   Looper.prepare();  
  15.   myLooper = Looper.myLooper();  
  16.   Looper.loop();开启消息循环  
  17. }  
  18.   
  19.  ThreadWithMessageHandle  threadWithMgs = new ThreadWithMessageHandle();  
  20.  threadWithMsg.start();  
  21.  Looper looper = threadWithMsg.myLooper;  
  22.   
  23.   
  24.   
  25.   
  26.  Handler threadHandler = new Handler(looper);  
  27.  threadHandler.sendMessage(...)  
  28. }  
  29.   
  30.   
  31. }  
  32.   
  33.   
  34.   
  35. ...  

好了,handler和looper的分析就都这了,其实原理挺简单的。

Android 中Looper机制详解 在《Android 基于Handler 剖析消息机制》一文中,以 Handler 类为起点详细分析了异步通信,分析了Java 端Handler与LooperMessage之前的通信关系。框架如下:在Java 端的 Looper 中会创建一个 Java 端的 MessageQueue实例,并在loop() 函数中的死循环里通过 queue.next() 不停的获取监听到的下一个 Message,然后将其通过 dispatchMessage() 分发处理。详细看。 阅读详情

相关推荐

fNIRS 公开数据集整理

关注“心仪脑”查看更多脑科学知识的分享。 关键词:数据整理、fNIRS 之前我们向大家推送了 Public Neuroscience Dataset 系列主题的第一期:《EEG公开数据集》,我们同时意识到大家对于神经科学公开数据集的需求。本期是该系列主题的第二期,我们在延续第一期初衷的基础上,整理了功能性近红外光谱(fNIRS)技术的公开数据集。 fNIRS 是一种非侵入性、便携且价格低廉的光学神经成像技术,它具有可观的空间和时间分辨率。因fNIRS技术问世较EEG晚了许多,所以应用此技术开展研究发.

psybrain的博客 4272

Android Looper和Handler

在Handler.java的sendMessageAtTime(Message msg, long uptimeMillis)方法中,我们看到,它找到它所引用的MessageQueue,然后将Message的target设定成自己(目的是为了在处理消息环节,Message能找到正确的Handler),再将这个Message纳入到消息队列中。至此,我们看到,一个Message经由Handler的发送,MessageQueue的入队,Looper的抽取,又再一次地回到Handler的怀抱。

hcgeng的专栏 502

从“氛围编程“到“智能体工程“:AI编程范式的认知跃迁与工程实践

摘要: 2026年,ClaudeCode负责人鲍里斯·切尔尼提出用“智能体工程”(Agent Engineering)替代流行的“氛围编程”(Vibe Coding),认为后者过于主观,无法体现AI编程的系统化与工程化本质。智能体工程强调记忆系统、工具编排、任务分解、可观测性等核心技术,将AI编程从“玄学辅助”升级为可度量、可规模化的工程学科。本文通过对比术语差异、构建知识体系,并结合代码实例(如带记忆系统的代码生成Agent和可观测性系统),展示了智能体工程的实际应用。行业案例(如ClaudeCode的并

yyq916的博客 1061

Android Looper简介

安卓Looper详解

qq_36063677的博客 3348

避坑指南:Windows11语言包安装后部分界面仍显示中文的终极解决方案

本文详细解析了Windows11语言包安装后部分界面仍显示中文的问题,提供了从基础到进阶的完整解决方案。通过PowerShell命令、注册表清理和系统文件检查等方法,帮助用户彻底解决语言显示不一致的问题,确保系统界面语言统一。

weixin_29232507的博客 1642

STM32HAL库硬件I2C驱动INA226避坑指南:从寄存器配置到电流测量实战

本文详细解析了使用STM32的HAL库硬件I2C驱动INA226电流/功率监测芯片的完整流程与常见陷阱。内容涵盖从硬件I2C配置、寄存器(特别是配置与校准寄存器)的深度解析、健壮的驱动函数封装,到实战中的校准技巧与滤波优化,旨在帮助开发者避开通信失败、数据不准等典型问题,实现高精度电流测量。

x1y2z的博客 791

安卓Loop机制剖析之Looper,handler

目录Looper是什么简单使用从源码了解loop原理myLooper()next()handler.dispatchMessagehandler分析消息入队同步屏障 Looper是什么 用于为线程运行消息循环的类。默认情况下,线程没有与之关联的消息循环。要创建一个,在要运行循环的线程中调用 prepare(),然后调用loop()让它处理消息,直到循环停止为止。与消息循环的大多数交互是通过 Handler类进行的。 意思大概就是让线程有处理消息的能力,并且这种能力是无限循环的,直到被停止为止。 简单使用

u012345683的博客 1890

人工智能训练师认证教程(5)使用MONAI进行医学影像分析的完整指南

本文介绍了使用MONAI框架进行医学影像分析的全流程。首先详细说明了环境搭建步骤,包括PyTorch和MONAI的安装配置。然后以肺部CT 3D分割为例,分步骤讲解了数据准备与预处理、3D UNet模型构建、训练配置(DiceLoss损失函数、Adam优化器等)以及训练验证循环的实现。文章还包含推理可视化方法和模型导出为ONNX格式的部署方案,并强调了医学影像分析中的数据格式适配、强度归一化、显存优化等关键注意事项。最后指出MONAI的医学专用组件可大幅简化开发流程,建议后续可探索SwinUNETR等进阶方

华为开发者布道师,天府英才计划,致力于大数据+AI 的应用创新,助力企业与个人AI创新赋能。 1212

Android之Handler、Looper、MessageQueue源码分析.md

概述 Android中的Handler、Looper、MessageQueue是用来解决线程间通讯问题的一种机制.介绍它们的文章非常多,这里做一些学习和整理,帮助自己理解,也希望能方便大家. 一句话 “Looper不断获取MessageQueue中的Message,然后由Handler来处理” 一张图 先记住一句话和一张图,对这三者有一个感性的认识,后面会介绍一个简单的demo,通过...

2514

2026年经典爬虫案例专栏|第17篇:学术论文爬虫实战——知网与万方数据采集

字段名说明数据类型title论文标题字符串authors作者列表列表abstract摘要字符串keywords关键词列表列表journal发表期刊字符串year发表年份整数volume卷号字符串issue期号字符串pages页码范围字符串citations引用次数整数downloads下载次数整数doiDOI编号字符串url论文链接字符串学术论文爬虫是科研工作的重要辅助工具,可以帮助研究人员高效地收集和管理论文数据。

2201_76125261的博客 1063

图注意力网络(GAT)原理与代码实战案例讲解

1. 背景介绍 图注意力网络(Graph Attention Network,简称GAT)是一种基于图神经网络(Graph Neural Networks,简称GNN)的深度学习方法。它能够处理具有复杂关系的节点数据,并在多个领域取得了显著的效果,如社交网络分析、推荐系统等。 2. 核心概念与联系

AI架构师小马 2716

Android源码分析--Handler和Looper机制详解

在Android系统中的应用程序,与Java的应用程序相同,都是靠消息驱动,简单的说就是:有一个消息队列,我们可以不断的向这个消息队列中添加消息,并从中取出消息,处理消息。Android中与此工作相关的主要是由Handler,Looper以及Message来完成。 Looper类:为一个线程运行着一个消息循环,内部有一个消息队列,每一个线程只允许最多存在一个Looper; Handler类:允许你向

Joe_c 的专栏 6859

Python的单元测试之unittest

是一个功能类似 unittest 的库,它集合众家标准测试库之所长,和 unittest 相比,功能更为强大,使用更为简单,OpenStack 广泛的利用它编写单元测试。unittest 提供了自动匹配发现并执行测试用例的功能,随着项目代码结构越发庞大,势必有多个测试文件,自动匹配发现并测试用例的功能在此就显得非常有用,只要满足。unittest 提供了丰富的命令行入口,可以根据需要执行某些特定的用例。的测试用例都会被 unittest 发现并执行,测试用例文件的默认匹配规则为 test*.py。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 283

【安卓笔记】Handler,Looper,MessageQueue,Message源码分析

这篇文章将分析android中的消息机制。 通过上一篇文章,我们了解到: 每一个handler其实都绑定了一个线程(Thread)和消息队列(MessageQueue),消息队列中存放的是一堆待处理的消息,Looper通过一个loop方法不断从消息队列中获取到消息(Message)(先进先出的方式),执行消息队列的出队方法,然后该消息会通过自身绑定target(其实是一个handler

RowandJJ 2940

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android应用程序消息处理机制(Looper、Handler)分析

Android应用程序是通过消息来驱动的,系统为每一个应用程序维护一个消息队例,应用程序的主线程不断地从这个消息队例中获取消息(Looper),然后对这些消息进行处理(Handler),这样就实现了通过消息来驱动应用程序的执行,本文将详细分析Android应用程序的消息处理机制。        前面我们学习Android应用程序中的Activity启动(Android应用程序启动过程源代码分析和A

老罗的Android之旅 11万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android源码分析——Looper,Messagequeue,Message,handler初始化及handler机制简介

Handler机制算是我入门源码的第一节。看得比较仔细。体会较多。mark一下。 顺序:先科普一下Handler基本功,然后再细讲下源码 一、Handler目的: 目的:Handler机制来处理了子线程去更新UI线程控件问题。 二、handler关系图: 其实各种书籍上都有这么一张图。但是主要是学习源码,所以还是自己手画一张“流程图”。 三、handler知识点总结: (若以下总结都

haibo_bear的博客 2863

Android 消息机制 - Handler, Looper, Message, MessageQueue 的源码分析

转载请注明本文出自 clevergump 的博客:http://blog.csdn.net/clevergump/article/details/50776596, 谢谢! 一. 前言 Android 的消息系统, 主要涉及到四个类: Handler, Message, MessageQueue 和 Looper. 而我们在日常开发中, 通常是将 Handler 对象定义在主线程中用于更新UI, 这样..

clevergump的专栏 2143

Android Loop机制中Looper与handler详细分析

根据以上所说的关系,画一张图:结论:handler的消息分为:同步消息,异步消息,屏障消息。handler的消息发送:消息都发送到了和它绑定的Looper的队列中去了。那么queue一对一looper,looper一对多handler,looper对象保存在所在线程的ThreadLocal中。

jh035的博客 1684

通过源码简要分析之Android消息机制Handler、Looper、MessageQueue运行机制

           用了许久的Handler,对于Handler的使用确实是比较熟悉,但是具体内部是如何运作的,却只是模糊的。Handler发出的消息怎么到达MessageQueue?MessageQueue的数据怎么被轮循处理?Looper是怎么循环取MessageQueue的消息的。今天,通过在子线程中创建Looper的实例,以追溯源码的方式来分析这个流程,通过这种方式来理解Android...

慢行的狮子 759

Android中的Handler、Looper、Message简要分析

1、Looper Looper的构造方法:构造方法中创建了一个消息队列private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mRun = true; mThread = Thread.currentThread(); } Loope

psply的博客 519

Android 源码分析 —— Handler、Looper 和 MessageQueue

本系列文章在 https://github.com/mzlogin/rtfsc-android 持(jing)续(chang)更(duan)新(geng)中,欢迎有兴趣的童鞋们关注。 本篇原始链接:https://github.com/mzlogin/rtfsc-android/blob/master/0x004-handler-looper-messagequeue.md 书接上...

靠谱-ing 658

Android的消息循环机制 Looper Handler类分析

http://www.cnblogs.com/mengdd/p/3601294.html

idea1____的博客 331

Android Handler工作流程分析(一)Looper篇

版本:Android11 前言 Handler是Android中的非常重要的消息机制,能够在线程之间传递消息,例如Android主线程中的操作都是通过主线程的Handler进行的。最近在参加面试的时候有问到Handler相关的知识,才发自己对于这一块知识理解不深,好多问题都无法答的很好。所以准备查看一遍Framework中相关的内容,查缺补漏,让自己能够更好的理解Android Handler机制。 问题点 在看源码之前先整理一遍问题点,带着问题查看源代码效率更高。大家在看文章时也可以先看一遍问题,如果问题

z404403的博客 2048

Android之的Looper与Handler分析(待)

Android中的Looper与Handler分析

姥姥教我学编程 764
上一篇: java静态内部类
下一篇: Singleton Pattern
perjer123
博客等级 码龄18年 6粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值