Handler简介及分析

Xorg Handler简介 目录简介注册BlockHandler和WakeupHandlerRegisterBlockAndWakeupHandlers注册到Screen注册InputHandler注册GeneralHandlerHandler的执行BlockHandler函数WakeupHandler函数xf86Wakeup函数 简介 Xorg Handler用于处理各种类型的回调函数,Xorg一共支持四种类型的Handl... 阅读详情
Handler简介:

一个Handler和线程,消息队列关联起来,允许你发送,处理,Message和Runnable。每个Handler实例和单独的线程,消息队列关联,当你创建一个新的handler,它就绑定到了消息队列(当前线程),它将传递Message和Runnable,执行它们当Message和Runnable从消息队列中出来的时候。

        其主要有2种用途;1:在未来执行一个Message或者runnable。2:将一个需要执行的action从一个不用的线程中放入一个队列中。

        当应用进程被创建的时候,在activities, broadcast receivers, etc(任何window被创建)中就有了消息队列。你可以在自己的thread(子线程)中创建,通过handler可以和主线程关联起来。通过post,sendMessage来实现。

        sendMessage可以携带bundle,需要实现handler来完成。


主要方法介绍:

        

        1:子类必须实现的方法

  1. public void handleMessage(Message msg) {}

      2:处理消息

  1.    /**
  2.     * Handle system messages here.
  3.     */
  4.    public void dispatchMessage(Message msg) {
  5.        if (msg.callback != null) {
  6.            handleCallback(msg);
  7.        } else {
  8.            if (mCallback != null) {
  9.                if (mCallback.handleMessage(msg)) {
  10.                    return;
  11.                }
  12.            }
  13.            handleMessage(msg);
  14.        }
  15.    }

        3:系列方法obtainMessage,都是调用了Message的同名方法。

  1.    public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
  2.    {
  3.        return Message.obtain(this, what, arg1, arg2, obj);
  4.    }
  5.    public static Message obtain(Handler h, int what,
  6.            int arg1, int arg2, Object obj) {
  7.        Message m = obtain();
  8.        m.target = h;
  9.        m.what = what;
  10.        m.arg1 = arg1;
  11.        m.arg2 = arg2;
  12.        m.obj = obj;
  13.        return m;
  14.    }

        4:系列方法post

  1.    public final boolean postDelayed(Runnable r, long delayMillis)
  2.    {
  3.        return sendMessageDelayed(getPostMessage(r), delayMillis);
  4.    }
  5.    private static Message getPostMessage(Runnable r) {
  6.        Message m = Message.obtain();
  7.        m.callback = r;
  8.        return m;
  9.    }

     可以看出,post也是通过Message来实现的。将runnable,obj封装成Message。

        5:系列方法send

        无论是sendEmptyMessage还是sendMessageDelayed,都是执行了sendMessageAtTime方法。

  1.  public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
  2.        MessageQueue queue = mQueue;
  3.        if (queue == null) {
  4.            RuntimeException e = new RuntimeException(
  5.                    this + " sendMessageAtTime() called with no mQueue");
  6.            Log.w("Looper", e.getMessage(), e);
  7.            return false;
  8.        }
  9.        return enqueueMessage(queue, msg, uptimeMillis);
  10.    }
  11. private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
  12.        msg.target = this;
  13.        if (mAsynchronous) {
  14.            msg.setAsynchronous(true);
  15.        }
  16.        return queue.enqueueMessage(msg, uptimeMillis);
  17.    }

        6:在activity的onDestory中执行removeCallbacksAndMessages方法,参数为null,移除所有的callback及message。


Message简介:

        Message可以包含int字段,object,callback,通过handler来传递数据。尽管Message的方法是public的,可是最好的方法是通过Message.obtain(),或者Handler.obtainMessage()。因为这个是从一个可以被回收利用的pool中获取的。

        message也可以发送Message。其实,还是通过handler来完成的。

  1. public void sendToTarget() {
  2.        target.sendMessage(this);
  3.    }
总结:

    到最后,都是获取MessageQueue然后执行enqueueMessage方法来实现的。无论是send,post,或者message的send,是否有延迟的。

Android Handler的机制跟源码分析 不断循环执行 Looper.loop() ,从 MessageQueue 中读取 Message ,按分发机制将消息分发出去给目标处理(将 Message 发到 Handler.dispatchMessage 方法去处理)。上面讲到了新建Message推荐使用 obtain() ,因为可以有效的复用消息,其中里面复用的就是 sPool 变量,它是在Message回收的时候进行赋值的。在应用启动时,会执行 main() 方法, main() 会创建一个 Looper 对象,然后开启一个死循环,目的是不断从。 阅读详情

相关推荐

Android的Handler基本原理源码分析

一、前言 学习Android基础知识,都离不开handler,最开始最基础的使用从Handler.post去发送一个消息,Android系统的设计中,为了保证UI渲染的一致性(本质上线程并发问题)和无卡顿体验。耗时的操作需要放在工作线程中执行(一般是开发者自行创建的子线程)、Ui更新放在主线程。这样从各自职责上来讲是非常清晰的,Handler的出现的一个核心目的,就是解决工作线程处理的数据如何传递给Ui线程进行使用。 **故而,**我们在研发中,子线程比如做耗时数据处理操作后,调用通过主线程创建的Handl

HYM BLOG 2335

真的了解Handler吗?

其实网上已经有很多关于Handler的文章,不管是源码方面的还是结构方面的,但如果只是看看别人理解的不是很深入,而且很快就没印象了。另外我最近在做一个功能的时候遇到了一些问题,一个View10秒平移到指定位置,View上面显示倒计时,这是个很简单的动画,但却出了一个很大的问题是倒计时的数字和View不同步,有时View已经结束了,但倒计时还剩1秒,倒计时的实现就是通过Handler的延迟发送消息实...

老孟Flutter 1059

使用Handler中遇到的问题分析

引言 Only one Looper may be created per thread Cant create handler inside thread that has not called Looperprepare 为何主线程中创建handler就没问题 handler内存泄漏引言相信很多童鞋在使用handler的时候肯定遇到了不少的麻烦吧,比如: 1、Only one Looper m

Colimuca的博客 1247

Handler,MessageQueue,Looper,你所不知道的Asynchronous

结合源码分析Handler还是可以异步的。

迷路啦的博客 3014

深入分析Android Handler消息机制

概述 Handler是Android消息机制的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下,Handler的使用场景就是 更新UI。 Handler的使用 在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI。 public class Activity extends android.app.Activity { private Handler mHandler = new Handler(){ @Override

nufuli123的博客 1586

Android基础之Handler分析

同步屏障的设置可以方便地处理那些优先级较高的异步消息。当我们调用并设置消息的时,target 即为 null ,也就开启了同步屏障。当在消息轮询器 Looper 在loop()中循环处理消息时,如若开启了同步屏障,会优先处理其中的异步消息,而阻碍同步消息。

2401_89760873的博客 987

(一)Handler

  面试被拒了两次表示很伤心。。。自己基础都忘光了 第一次遇到的一面试官大大还是很好的,他和我说即使搬砖也要搬地比别人好,推荐我多看看博客,自己平常时间多研究研究新技术。 工作三年,不常用的基础知识几乎忘光了,从基础开始吧。   -------------------------------------------------开始啦----------------------------...

JT的专栏 1713

COMSOL相场法模拟枝晶生长:溶质偏析模型搭建全流程

凝固过程中枝晶形貌与溶质偏析直接决定铸件微观组织与力学性能,是材料加工领域长期关注的核心问题。相场法凭借弥散界面描述天然处理拓扑演化,成为模拟枝晶生长的主流数值方法,而通用有限元平台COMSOL为自定义偏微分方程求解提供了高度灵活的实现路径。从热力学驱动、界面各向异性到溶质再分配,模型需准确耦合相场方程与浓度扩散方程,才能在二元合金凝固模拟中还原真实枝晶尖端速度、二次臂形貌及界面富集行为。围绕溶质偏析这一关键变量,建模过程涉及无量纲化参数标定、反溶质截留项配置、分离式求解器与网格各向异性控制等核心细节。该方

weixin_30402231的博客 308

Handler异步消息处理机制 总结

参考:http://blog.youkuaiyun.com/yanbober/article/details/45936145 1,概述 消息处理机制中,主要有这么几个概念,handler、looper、message、messageQueue。 在handler的构造函数中,对looper、messageQuenu进行初始化 public Handler(Callback callback,

MBlog 428

KIBANA可视化管理界面说明

更说明转自https://blog.youkuaiyun.com/IT_ZRS/article/details/125496588 1 主要结构功能 使用浏览器访问 ip:5601 默认端口,进入首页 Discover:日志管理视图 主要进行搜索和查询 Visualize:统计视图 构建可视化的图表 Dashboard:仪表视图 将构建的图表组合形成图表盘 Timelion:时间轴视图 随着时间流逝的数据 APM:性能管理视图 应用程序的性能管理系统 Canvas:大屏展示

tian830937的专栏 7084

开源AI数字人DUIX:从零构建你的智能交互助手

本文详细介绍了如何利用开源AI数字人DUIX从零构建智能交互助手。文章阐述了DUIX作为开源项目的核心优势,包括低成本启动、低网络依赖和高度可定制性,并提供了从开发环境搭建、核心模块(AI模型、语音、形象)配置到个性化业务逻辑开发与最终部署的完整实践指南,帮助开发者快速掌握构建专属AI数字人的全流程。

weixin_29051811的博客 504

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

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

haibo_bear的博客 2863

AI Agent智能体在Android开发中的应用

本文探讨了AIAgent(智能代理体)在Android开发中的应用,涵盖技术原理、实践案例与未来趋势。AIAgent通过机器学习、自然语言处理等技术实现代码生成、测试自动化及性能优化,显著提升开发效率。例如,强化学习模型可优化APP响应时间(公式:$\text{响应时间}=f(\text{负载},\text{资源})$),自动化测试覆盖率提升至95%。

郑伟强dev的专栏 124

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

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

holiday_ob的专栏 379

使用verilog设计实现QR分解

QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应用的方法,一般矩阵先经过正交相似变化成为Hessenberg矩阵,然后再应用QR方法求特征值和特征向量。 使用verilog对QR实现方法进行设计并进行功能仿真: 如下: 顶层模块代码: module TOP( H1R, H1I, H2R, H2I, H3R, H3I, H4R, H4I, clk, rst_n, Y1R, Y1I, Y2R, Y2I, X1R, X1I, X2R, X2I ); parameter width = 16; // I

QQ_778132974的博客 2150

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

为了兼容这部分手机,车机端在向手机端发送USB控制命令字的同时,需要启动mDNS Server,广播车机端IP地址和HiCar SDK侦听的Server Socket端口(IP地址和端口在HiCar SDK初始化USB driver时,告知车机),在检测到手机断开USB连接时关闭mDNS Server。厂商在集成HiCar SDK开发HMI应用时,不可避免会使用到智能座舱的敏感权限,例如位置权限、摄像头权限、麦克风权限等,SDK初始化时,厂商HMI应用需要设置必要的车机参数供SDK使用。

码农17年的博客 1075

【Android 异步操作】Handler 机制 ( Handler 常用用法 | HandlerThread 简介 | HandlerThread 源码注释分析 )

一、Handler 常用用法、 二、HandlerThread 简介、 三、HandlerThread 源码、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1018

信号处理算法:自适应滤波_(8).自适应陷波器

自适应陷波器是一种强大的工具,广泛应用于电力系统、通信系统和生物医学信号处理等领域。通过自适应调整滤波器的参数,自适应陷波器可以在特定频率处形成陷波,从而有效地抑制噪声或干扰信号。常见的自适应算法包括LMS和RLS,它们各有优缺点,可以根据实际需求选择合适的算法。

2401_87715305的博客 1371

Android Handler的源码分析

1、简述 由于安卓中为了确保界面的更新同步,限制了只有UI(主)线程可以更新界面,但是UI线程不能执行耗时操作,相关的文件读取、数据加载和网络请求等操作,需要放置在子线程进行处理,但处理完成后怎样将子线程的处理结果及时的发送至主线程呢? 此时就需要引入Handler的运行机制,通过Hnadler的创建、发送和处理方式,实现跨线程的数据通信。 其实Handelr主要用于线程间通信的,但在安卓开发中一...

xk7298的博客 1946

SolidWorks速成教程P3-6【零件 | 第六节】——草图封闭轮廓&所选轮廓&厚度为零的报错

到这里,我们已经将特征成型的常用功能学完。这节我来继续讲解一下 SolidWorks中建模的一些容易忽略的问题(草图封闭轮廓&所选轮廓&厚度为零的报错)。

嵌入式阿齐Archie 5780

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Handler源码分析

Handler是一套消息处理机制,可以通过它发送消息,并将所有的消息在指定的线程统一处理。

wucomi的博客 1150

Devexpress16.2.6破解工具

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

Handler类简介及应用

一、Handler的定义 是异步通信的类,主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 二、Handler主要通过Looper和MessageQueue来完成更新UI,那么什么是Looper和MessageQueue呢 1、Looper: 每个线程只能够有一个Looper,Looper负责创建并管理当前线程中的MessageQueue,调用loop方法后...

shaochen2015821426的博客 6716

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Handler 简介

文章目录概要源码分析Looper.prepare() 作用及实现loop 如何实现等待功能 概要 Handler 主要有两个作用 定时执行消息或 Runnable 任务 向其它线程发送消息或 Runnable 任务 Handler 是 Android 消息分发处理机制中的一个组件。与 Looper、MessageQueue、Message 共同完成消息发送与处理。它们之间关系如下:每个线程对应...

BillionLeeGogogo 825

Android中Handler简介

1.本文的阅读对象 本文的阅读对象是掌握了一些安卓基础知识的朋友,本文不会涉及源码,也不会有过多代码,对新手比较友好,用简单容易理解的语言描述Handler在安卓开发中的作用 2.Handler是什么? 我们先从字面分析,Handler由英文直译,可以翻译为处理者。在Android中,Handler机制主要用作异步消息处理,这是谷歌设计的一套机制,能帮助我们有序的处理异步操作。 3.And

周敬斌的博客 1240
上一篇: Webview解析html源码
下一篇: Looper介绍
arplay
博客等级 码龄12年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值