Handle初解,看完你就懂了handle


前言

提示:看完本篇,你可以了解到Handle的相关知识与常见的误区提醒


一、Handle是什么?

我们查看一下谷歌官方对其的定义:
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.

Handler它可以通过消息队列发送消息或者runable对象,也可以处理消息或者runable对象。每一个handler实例,都持有一个线程以及此线程的消息队列。
那么handle相当于什么呢?其实就相当于我们现实世界的搬运工,可以发送消息,也可以处理消息。

二、Handle有啥用呢?

1.传递消息到ui线程

在我们安卓开发的时候,我们都知道ui线程是不可以进行耗时操作的,如果在这里进行的话,就会导致ANR,因此开辟一个子线程,在子线程中去处理相关的耗时任务,这是必然的结果。那么处理完的结果需要改变ui,即我们的控件显示的时候怎么办呢?在子线程中处理完直接改变ui是安卓中不允许的行为,因为ui线程不是线程安全的,那么我们有必要需要一个工具将子线程处理的结果带回去给ui线程去显示,而handle正是完成了这个任务。

2.代码示例

主线程定义一个handle(mHandle),构造方法里面new一个callback,复写handleMessage方法,这
就表明当有信息来的时候,由handleMessage方法去执行
      mHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(@NonNull Message msg) {
                //处理消息
                if(msg.what == 1) {
                    Log.d("hanldeTest","object is -- > " + msg.obj);
                }
                return false;
            }
        });
子线程中,假设处理完了一些耗时操作,比如读写数据库,随后即可执行一下代码
Message message = mHandler.obtainMessage();
        message.what = 1;
        message.obj = "我是新消息!";
        mHandler.sendMessage(message);

这样子一个发送,一个接受,就完成了就基本的handle使用,值得注意的是,上诉方法已经过期了
在这里插入图片描述
下面是最新的使用方法:

        boolean test=new Handler(getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
              //更新ui处理,在耗时任务完成后
            }
        });

这里细心观察的小伙伴就会发现,参数里面有一个getMainLooper(),字面意思就是获得主looper对吧,那么looper是个啥?拿了有啥用?我们先以过期的方法去解释更方便
handle源码:

    public Handler(@Nullable Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Handler> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                    klass.getCanonicalName());
            }
        }

        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread " + Thread.currentThread()
                        + " that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

这里有个值得的两个对象,mLooper,mQueue。当系统创建一个ActivityThread的时候,也创建了一个Looper,在looper里面有一个消息队列(其实是单链表结构的东西),Looper负责不断循环保持我们的程序不会结束,queue则负责接受消息,然后有handle去处理。我们一个线程只有一个looper,负责当前线程的不中断,但是handle可以有多个,所有的handle都依附于某个消息队列(没有队列你要搬运工干嘛对吧),而队列由looper创建,这也相当于handle间接依赖于looper了嘛~(看源码mQueue = mLooper.mQueue;)
因为系统一开始就创建好ui线程的时候也自动帮我们创建好了looper,也所以我们在主线程创建的时候可以不用关心handle具体依附于哪个looper。
但是如果在子线程中呢?子线程则没有这样好的待遇,它没有自动生成looper,所以我们在普通子线程中创建handle不指定好特定的looper就会报错,因为handle要好好依赖于一个消息队列,而消息队列由我们的looper产生的嘛~因此就有了new Handler((放一个looper过来!))这个方法,如
new Handler(getMainLooper())。

3注意点

下面说一下几个注意点,我在面试的时候看到面试官也会问错的问题。handle是如何实现异步的?
可能有的同学就会说,异步?就创建一个子线程啊!其实handle,runnable之类的并不会创建一个新线程!

1、handle可以在主线程中创建,而正在使用发送信息是在子线程,而不是handle自己new了一个子线程
2、handle创建的时候依赖于传入的looper,如果传入的looper是ui线程的looper,那么当在子线程调用的时候,handle发送的消息也是发送到ui线程的消息队列里面,由消息队列取出来再处理,所以才会有这样一个异步的操作。线程的looper一直在调用.loop方法,去查询消息队列有没有东西,有的话就取出来。
源码如下

public static void loop() {
        final Looper me = myLooper();
		
		......
		
		//开始轮询,这个轮询可能阻塞
        for (;;) {
            Message msg = queue.next(); // might block
            if (msg == null) {
                // No message indicates that the message queue is quitting.
                return;
            }
			
			......
			
            long origWorkSource = ThreadLocalWorkSource.setUid(msg.workSourceUid);
            try {
                msg.target.dispatchMessage(msg);
                if (observer != null) {
                    observer.messageDispatched(token, msg);
                }
                dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
            } catch (Exception exception) {
                if (observer != null) {
                    observer.dispatchingThrewException(token, msg, exception);
                }
                throw exception;
            } finally {
                ThreadLocalWorkSource.restore(origWorkSource);
                if (traceTag != 0) {
                    Trace.traceEnd(traceTag);
                }
            }
			
			......
			
            msg.recycleUnchecked();
        }
    }

最后

看到这里你应该对handle处理消息是如何进行的吧,感谢各位看官~

Chimoshi
关注 关注
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
万字博文教你爬虫必备->Selenium【详解篇】(初篇)
孤寒者的博客
08-05 53万+
万字博文教你爬虫必备->Selenium【详解篇】(初篇)
绿米Aqara S1【妙控开关 S1E】的破解方法
LeeKwen的专栏
10-26 1399
为了更好地向友商学习,我们采购了绿米的一块妙控开关 S1E的屏幕,用来研究。首先上图看一下他的设计及推广的说明:产品详情,参见Aqara的官方网站:具体链接:妙控开关 S1E|Aqara 全屋智能这里我就直接上硬件的说明了。官方的设备参数如下:我来写一下他们的硬件所用的参数:主控芯片为 SigmaStar SSD212,NAND为我们主要的是想进入其系统之中,看一下他的整个文件系统及设备实现的逻辑。界面部分我们就不再说明了,采用不同的主题,可以显示各种炫酷的巧克力界面,这种官方已经宣传的很到位了。我们需要先
C 语言句柄handle
Godsight的博客
10-05 3万+
我觉得自己对于指针理解比较透彻了,但关于句柄的理解,就容易犯理解成指针的错误.  一般说:句柄是资源(或项目)的唯一标识.  俺觉得这其实说得很不明白的,现在我想问的是句柄到底是怎么标识资源的:  1,句柄在32位机上是32位整型吗?  2,当HANDLE handle;声明句柄时,handle是它的标识符吗?如int a;则a就是标识符.  3,既然句柄是一个整型值,那么,它在内存的什
Android Handler源码解析
HappyHeng的博客
06-30 821
上一篇的地址为 Android Looper源码解析 Android中的Handler是用来接受消息,并处理消息中的内容。它可以看成是一个线程的接口,当给它发送消息时,其对应的线程便会处理消息。 Google的介绍为: A Handler allows you to send and process {@link Message} and Runnable objects assoc
handler全解
qq_46577594的博客
01-24 1万+
handler一,handler简介及其使用场景(1)handler简介(2)handler使用场景二,handler工作原理分析(1)handler工作流程(2)Message(3)Messagequeue1-普通消息2-同步屏障与异步消息3-阻塞与唤醒(pipe/epoll机制)(4)Looper1-ThreadLocal机制(5)IdleHandler介绍与使用场景一,handler常见问题分析(1)内存泄露问题(2)非ui线程操作view(3)View.post与handler.post的区别 一,
Handler详解
weixin_45532772的博客
01-31 1228
handler 机制复习: handler 总共由四部分构成:Message , Handler , Looper , MessageQueue. 一、Message Message可以但是不建议通过new一个实例化对象进行初始化。一般采用以下 API 获取 static Message obtain() static Message obtain(Message orig) static Message obtain(Handler h) static Message obtain(Handler h,
handle原理解析
李平的博客
04-21 1424
handle原理解析 1、首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。 2、Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。 3、Handler的构造方法,会首先得到当前线程中保存的Lo
Handle本地调试及基础开发
Obuuu的博客
10-18 2487
Handle本地调试及基础开发 文章目录Handle本地调试及基础开发1.前言2.Handle的介绍3.Handle环境搭建&解析3.1环境3.2搭建步骤问题解决3.3Global解析3.4本地解析4.Handle的基础开发--解析Global及本地Handle值4.1建项目4.2改pom4.3主启动4.4handle解析函数5.结语 1.前言 本文主要介绍Handle标识解析服务的搭建及利用JAVA库进行本地handle以及Global’s Handle解析的开发 本文不会过多赘述Handle
CSTR&Handle Java 客户端.rar
05-31
文章介绍了Android NDK开发的简单概念、常见错误及处理和从第一个Hello World开始实际做一个简单的JNI开发示例,相信看之后,大家对NDK开发有了一个概念上的认识了,那么接下来我们需要再深入一下NDK的开发,我们...
一看就!Springboot +Shiro +VUE 前后端分离式权限管理系统
热门推荐
大誌的博客
04-15 6万+
前段日子写过一篇关于SpringBoot+Shiro的简单整合的例子,那个例子并不适用于我们目前的前后端分离开发的趋势。我之前写过一个项目也是用到了Shiro的前后端分离,某度了许久也没找到解决方案,什么去掉shiroFilter.setLoginUrl();也阻止不了讨人厌的login.jsp的出现。直到我看到了renren-fast的源码...废话不多说,让我们来看看如何实现吧 前后端分离...
关于Handler技术
Robin Hu的专栏
10-22 1219
android里面对于异步消息的处理,提供了一套Handler的实现方案。Handler有很多适宜的应用和微妙之处,使它在和Thread以及 Service等一起使用的时候达到很好的效果。 一、Handler与Thread的区别 默认情况下Handler与其创建者处于同一线程,如果Handler里面做耗时的动作,调用者线程会阻塞。 Android UI操作不是线程安全的,并且这些操作必须在U
Android——Handler详解
最新发布
qq_33209777的博客
12-22 728
main方法是整个android应用的入口,在子线程中调用Looper.prepare()是为了创建一个Looper对象,并将该对象存储在当前线程的ThreadLocal中,每个线程都会有一个ThreadLocal,它为每个线程提供了一个本地的副本变量机制,实现了和其它线程隔离,并且这种变量只在本线程的生命周期内起作用,可以减少同一个线程内多个方法之间的公共变量传递的复杂度。其内部维护了一个Message池,其是一个链表结构,当调用obtain()的时候会复用表头的Message,然后会指向下一个。
handle
09-06 700
Handle A handle is a part of, or attachment to, an object that can be moved or used by hand. The design of each type of handle involves substantial ergonomic issues, even where these are dealt with
Android中的Handler的机制与用法详解
wangning13ji的博客
08-23 4990
目录结构 Android中的Handler的机制与用法详解,什么是Handler,如何传递 Message,传递 Runnable 对象,传递 Callback 对象,Handler 原理是什么?Handler 与 Looper、MessageQueue 的关系,HandlerThread是什么?Android 中更新 UI 的几种方式。 1. 了解几个概念 很多Androi
Handle的原理(Looper、Handler、Message三者关系)
安辉
05-20 1万+
介绍前面的内容对Handler做了介绍,也讲解了如何使用handler,但是我们并不知道他的实现原理。本文从源码的角度来分析如何实现的。首先我们得知道Handler,Looper,Message Queue三者之间的关系 - Handler封装了消息的发送,也负责接收消。内部会跟Looper关联。 - Looper 消息封装的载,内部包含了MessageQueue,负责从MessageQueue
Handler机制-源码解析
安妍妍的博客
01-29 425
Handler经常被用来实现线程间通信,使用也很简单,今天得空学习了Handler相关的源码,在此记录加深印象,同时也希望帮助到其他的小伙伴们。 Handler的使用 Handler的使用很简单,最常见的是在UI线程创建Handler对象,在其他子线程中调用handler.sendMessage()相关方法,从而实现线程间通信的目的。如下: private Handler handler
系统源码解析——Handler
a2923790861的博客
08-14 247
解析背景 常见于异步线程持有主线程handler对象,借助于handler发送message回调其 dispatchMessage 方法成异步通讯 。 再者,Android 源码中大量使用handler用于 UI 线程间/线程内通讯。比如 Messener,ViewRootImpl 等等。最近在整理以前源码笔记, 就把整个源码过程都分享下 。 源码解析 涉及核心类 Looper 类, 负责在messageQueue中读取message并调用对应 target (...
Handler 的定义
qq_28173033的博客
09-21 392
主要接受子线程发送的数据,并用此数据配合主线程更新UI 解释:当应用程序启动时,android 首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,你要是点击一个Button ,android 会分发事件到Button 上,来响应你的操作,如果此时需要一个耗时操作。例如:联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放
写文章

热门文章

  • magicindicator的使用详解 12668
  • PopupWindow位置控制showAtLocation解析 6381
  • Handle初解,看完你就懂了handle 5472
  • Android多线程的几种实现方式 1476
  • Android自定义布局-onInterceptTouchEvent事件 704

最新评论

  • Handle初解,看完你就懂了handle

    xpl肖朋礼: 这是用c++吗?怎么运行不了呀?

  • magicindicator的使用详解

    别说我太单纯: 棒哥

  • magicindicator的使用详解

    别说我太单纯: 🔴收藏了.2021.1.7

  • Android多线程的几种实现方式

    陳傢兴: 谢谢

  • magicindicator的使用详解

    Chimoshi: 点赞关注收藏投币

大家在看

  • C++——继承 1721
  • ssm基于web的马病管理系统设计与实现+jsp
  • 服务器的介绍 786
  • 霹雳吧啦wz3(膨胀卷积)
  • Mysql的日志体系以及事务特性

最新文章

  • PopupWindow位置控制showAtLocation解析
  • RXJava常用流程解析与手写RXJava
  • LiveData解析和项目遇到的问题记录
2021年4篇
2020年7篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家甘南玻璃钢植物雕塑红河商场美陈展示上海玻璃钢雕塑作品玻璃钢花花盆天津商场主题创意商业美陈创作玻璃钢造型雕塑哪家有名四川创意玻璃钢雕塑定做价格四川仿铜玻璃钢雕塑制作武威市玻璃钢雕塑昌吉玻璃钢雕塑造型贴金玻璃钢雕塑 时间宣城大型户外玻璃钢雕塑多少钱浙江步行街玻璃钢雕塑批发益阳玻璃钢动物雕塑丽江玻璃钢雕塑批发临沧玻璃钢雕塑商家中庭商场美陈现价玻璃钢西瓜雕塑现货供应四川周边商场美陈批发价沧州园林玻璃钢雕塑厂家气球商场美陈哪里专业济源花朵玻璃钢仿铜雕塑青岛玻璃钢花盆生产廊坊节日商场美陈锦州商场美陈周年商场美陈批发价黄冈玻璃钢雕塑浮雕厂玻璃钢软体雕塑动态图玻璃钢美国队长雕塑昌邑玻璃钢胸像雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化