关闭

handler机制的原理

172543人阅读 评论(35) 收藏 举报
分类:
andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。

1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。

4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

1.Handler创建消息

        每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。消息的创建流程如图所示。


2.Handler发送消息

UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。

Handler、Looper、MessageQueue的初始化流程如图所示:


Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。

3.Handler处理消息

UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。

子线程通过Handler、Looper与UI主线程通信的流程如图所示。




61
13
查看评论

Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自【张鸿洋的博客】很多人面试肯定都被问到过,请问Android中的Looper , Handler , Message有什么关系?本篇博客目的首先为...
  • lmj623565791
  • lmj623565791
  • 2014-08-07 09:17
  • 198175

Handler运行机制

Handler原理分析
  • u012827296
  • u012827296
  • 2016-04-24 22:52
  • 18880

终于明白了Handler的运行机制

前言 Handler是一个Android SDK 提供给开发者方便进行异步消息处理的类。 我们都知道在UI线程中不能进行耗时操作,例如数据读写、网络请求。Android 4.0开始,在主线程中进行网络请求甚至会抛出Android.os.NetworkOnMainThreadException。这...
  • garyhu1
  • garyhu1
  • 2017-01-16 14:01
  • 1818

有关Handler机制原理的总结

Handler是线程与线程间进行通信的一套机制。        Handler是常被开发者拿来更新UI的一种消息处理机制,它的运行机制需要底层的Looper和MessageQueue的支撑。    ...
  • duanmulirui
  • duanmulirui
  • 2017-03-31 15:30
  • 875

【Android自助餐】Handler消息机制完全解析(三)Handler解析

Android自助餐Handler消息机制完全解析(三)Handler解析Android自助餐Handler消息机制完全解析三Handler解析 Handler 构造方法 创建消息obtainMessage 发送消息sendMessage 移除消息removeMessage 处理消息dispatch...
  • xmh19936688
  • xmh19936688
  • 2016-07-13 20:53
  • 8137

Android消息机制Handler解析(源码+Demo)

Handler是开发人员在面试过程中最常见的问题之一了,这篇文章将较为全面地对Handler进行解读,包括源码层,以及使用方法。 如果看完文章有疑问,欢迎在评论中一起探讨 基本内容包括: 看完文章之后,可以用这个图片进行复习。 一、什么是Handler Handler是Android提...
  • chen_lian_
  • chen_lian_
  • 2016-04-01 00:25
  • 4532

Handler详解(最容易看懂,最容易理解)

好吧好吧,今天去面试的时候,一个熊二般的面试官问我handler的机制,以及和Looper的关系,以及更新UI有哪些方式。可是我是小白啊,所以不知道,所以就不可能通过面试,不过今年工作可真不好找。回来后又是把书籍,又是看视频,最终还是打算写成自己的博客。希望帮助到其他的小白。 下面我们通过...
  • bobo8945510
  • bobo8945510
  • 2016-07-08 21:44
  • 2209

Android的消息机制——Handler的工作过程

在Android系统中,出于对性能优化的考虑,对于Android的UI操作并不是线程安全的。也就是说若是有多个线程来操作UI组件,就会有可能导致线程安全问题。所以在Android中规定只能在UI线程中对UI进行操作。这个UI线程是在应用第一次启动时开启的,也称之为主线程(Main Thread),该...
  • ljd2038
  • ljd2038
  • 2016-03-14 20:54
  • 7144

Android异步消息处理机制完全解析,带你从源码的角度彻底理解

我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获...
  • sinyu890807
  • sinyu890807
  • 2013-08-22 14:02
  • 86161

深入源码解析Android中的Handler,Message,MessageQueue,Looper

本文主要是对Handler和消息循环的实现原理进行源码分析,通过分析源码的方式去探索Thread、MessageQueue、Looper、Message以及Handler的实现原理,并最终通过一张图的形式将它们之间的关系展示出来。
  • sunqunsunqun
  • sunqunsunqun
  • 2015-08-01 02:20
  • 15559
    我的新书
    个人资料
    • 访问:1913489次
    • 积分:16642
    • 等级:
    • 排名:第729名
    • 原创:191篇
    • 转载:52篇
    • 译文:0篇
    • 评论:1020条
    我的微博
    最新评论
    公众号
    百度统计