Handler原理机制解析,Android开发中的重要性

这篇具有很好参考价值的文章主要介绍了Handler原理机制解析,Android开发中的重要性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Handler在android程序开发中使用的非常频繁、我们知道android是不允许在子线程中更新UI的,这就需要借助Handler来实现,那么你是否想过为什么一定要这个这样子做呢?而且Handler的内部消息处理机制究竟是什么样的呢?Handler的原理是需要通过源代码才能说的清楚的,而且它处理机制比较复杂。

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

Handler的工作流程

Handler原理机制解析,Android开发中的重要性,android开发,android,Android开发,程序员开发,Android面试,程序员,handler

添加图片注释,不超过 140 字(可选)

Looper就像传送带传送消息,handler通过send/post方法,将货物送上传送带,这些货物就是message,排成messageQueue。当Looper.loop()调用,就是给传送带插上了电,无休止地转动,当传送到那一头了,就通过handler.dispatch()方法传递给需要货物的地方。

原理

简单概括一下:

Handler创建时会采用当前线程的Looper来构建内部的消息循环系统如果当前线程没有Looper那么就会报错,因此使用时主要为当前线程创建Looper即可或者在一个有Looper的线程中创建Handler也可以,在我们的UI线程中系统已经在一开始就为我们创建好了,自定义的子线程如何创建后面会说。

首先需要搞定几个概念

【MessageQueue】是一种数据结构,见名知义,就是一个消息队列(注意不是数据结构的队列,其实是个单链表),存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。创建一个线程的时候,并不会自动创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。主线程创建时,会创建一个默认的Looper对象,而Looper对象的创建,将自动创建一个Message Queue。其他非主线程,不会自动创建Looper,要需要的时候,通过调用prepare函数来实现。

示例:

[java]  view plain  copy
public void run(){   
          Looper.prepare(); //创建该线程的Looper对象  
 //这里Looper.myLooper()获得的就是该线程的Looper对象了  
          handler = new ThreadHandler(Looper.myLooper());   
          Message msg = handler.obtainMessage(1,1,1,"我自己");   
          handler.sendMessage(msg);        
          Looper.loop();  
 
      }   

俩行代码,该线程就具有自己的Looper啦

【Message】消息对象

MessageQueue里面可以存放Message的消息一个Message Queue中包含多个Message。Message实例对象的取得,通常使用Message类里的静态方法obtain(),该方法有多个重载版本可供选择;它的创建并不一定是直接创建一个新的实例,而是先从Message Pool(消息池)中看有没有可用的Message实例,存在则直接取出返回这个实例。

[java]  view plain  copy


/** 
     * Return a new Message instance from the global pool. Allows us to 
     * avoid allocating new objects in many cases. 
     */ 
 public static Message obtain() {  
 synchronized (sPoolSync) {  
 if (sPool != null) {  
                Message m = sPool;  
                sPool = m.next;  
                m.next = null;  
                m.flags = 0; // clear in-use flag 
                sPoolSize--;  
 return m;  
            }  
        }  
 return new Message();  
    }  

源码中可以看出如果Message Pool中没有可用的Message实例(poolsize=50),则才用给定的参数创建一个Message对象。调用removeMessages()时,将Message从Message Queue中删除,同时放入到Message Pool中。除了上面这种方式,也可以通过Handler对象的obtainMessage()获取一个Message实例。

通常Message Queue只有俩种单链表操作 插入(对应方法enqueueMessage)和读取(next)

【Looper】

是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare函数来实现的。同时每一个Looper对象和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象创建一个Looper对象时,会同时创建一个MessageQueue对象。除了主线程有默认的Looper,其他线程默认是没有MessageQueue对象的,所以,不能接受Message。如需要接受,自己定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。Looper从MessageQueue中取出Message然后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。

Looper扮演着消息循环角色,一有消息就处理,否则就阻塞在那里。

本文主要是对在Android开发中,Handler的原理机制的解析。Handler在Android开发中处于非常重要的技术之一。更多有关Handler的技术或者高级Android开发,可以参考《Android核心开发手册》点击可以查看详细类目。

Handler原理机制解析,Android开发中的重要性,android开发,android,Android开发,程序员开发,Android面试,程序员,handler文章来源地址https://www.toymoban.com/news/detail-741757.html

到了这里,关于Handler原理机制解析,Android开发中的重要性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android之handler消息处理机制详解

    handler是什么? ​ Handler是一个在消息处理机制中负责发送和处理消息的类,是消息处理的关键。 Handler:负责 发送消息 和处理消息 Looper:内置一个死循环,可以不断的 取出消息 并通知handler处理消息,是handler起作用的基础 Message:消息实体类 MessageQueue:消息队列,负责存储消

    2024年02月04日
    浏览(36)
  • Android面试题精选——再聊Android-Handler机制-1,已开源

    下面想看Handler的工作流程图:(第一次画图,有点丑,凑合着看吧) 因为Handler的主要作用就是线程切换,所以在图中我把Handler线程变化也画了出来。从这张图我们能看出几点信息: **1、Handler负责消息的发送和处理:**Handler发送消息给MessageQueue和接收Looper返回的消息并且处理

    2024年04月12日
    浏览(32)
  • 安卓架构核心Handler原理解析

    当使用 handler 去发送一个消息的时候,查看调用栈,发现最终会调用到 MessageQueue.equeueMessage ,那么说既然是个 queue 肯定就有增和删, equeueMessage 就对应它的增,再看看是谁在调用 MessageQueue 。 不妨猜想一下,既然平常写这个 handler 都在主线程,而且主线程的入口就在 main ,

    2023年04月09日
    浏览(22)
  • 【Android】多线程编程、异步消息处理机制以及new Handler()被标记为过时的解决办法,解决Handler内存泄漏问题和AsyncTask的基本用法

    1.1 弱引用 WeakReference (弱引用)是一种在Java中用于管理对象的引用的特殊引用类型。它的作用是在垃圾回收过程中,允许对象在没有强引用指向它时被回收( 当一个对象只有弱引用指向它,而没有强引用指向它时,垃圾回收器可能会在下一次垃圾回收时回收该对象,即使系

    2024年02月04日
    浏览(33)
  • TypeScript在前端开发中的重要性

    近年来, TypeScript 在前端开发中的重要性逐渐得到认可。作为一种静态类型的 JavaScript 的超集, TypeScript 通过引入静态类型、接口、类等特性,为前端开发带来了许多优势。本文将探讨 TypeScript 在前端开发中的重要性,并通过代码论证其价值。 首先, TypeScript 通过引入静态类

    2024年02月11日
    浏览(29)
  • HTTP与HTTPS:深度解析两种网络协议的工作原理、安全机制、性能影响与现代Web应用中的重要角色

    HTTP (HyperText Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 是互联网通信中不可或缺的两种协议,它们共同支撑了全球范围内的Web内容传输与交互。本文将深度解析HTTP与HTTPS的工作原理、安全机制、性能影响,并探讨它们在现代Web应用中的核心角色。 HTTP 是一种应用层协议

    2024年04月11日
    浏览(45)
  • Handler机制(一)——Handler运行流程分析

    Handler机制是Android的异步消息处理机制,用于在线程间传递消息,主要涉及到四部分:Handler、Looper、Message和MessageQueue。其中Handler是消息的发送者和处理者;Message是消息主体;MessageQueue是消息队列,Handler发送的消息都会放入MessageQueue中等待处理;Looper是MessageQueue的管理者,里

    2024年02月13日
    浏览(32)
  • 结合源码拆解Handler机制

    作者:Pingred 当初在讲App启动流程的时候,它的整个流程涉及到的类可以汇总成下面这张图: 那时着重讲了AMS、PMS、Binder这些知识点,有一个是没有对它进行详细讲解的,那就是常见的Handler,它不仅在这个流程里作用在ApplicationThread和ActivityThread进行通信,它在整个安卓体系

    2024年02月11日
    浏览(30)
  • Spring事件监听机制使用和原理解析

    你好,我是刘牌! 好久没有更新Spring了,今天来分享一下Spring的事件监听机制,之前分享过一篇Spring监听机制的使用,今天从原理上进行解析,Spring的监听机制基于观察者模式,就是就是我们所说的发布订阅模式,这种模式可以在一定程度上实现代码的解耦,如果想要实现系

    2024年02月08日
    浏览(28)
  • 深入探讨进程间通信的重要性:理解不同的通信机制(上)

    在操作系统中,进程间通信是指不同进程之间进行信息共享、数据传输和消息通知等交互的过程。每个进程在创建时都有自己独立的虚拟地址空间,但它们共享内核空间。因此,要实现进程间的通信,必须通过内核来进行中介,如下图所示: 在Linux系统中,提供了多种进程间

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包