专栏首页Android小知识从头再看Handler

从头再看Handler

Handler是什么

  • 想必每一个做安卓开发的人都知道Handler,就是线程间通信的桥梁,那么他的本质是什么呢,说白了就是内存共享。

Handler的是如何实现内存共享的

  • 这就要说到Message消息,说到消息就需要说到MessageQueue消息队列,那么有了消息和消息队列,肯定少不了Looper消息泵,最后如何运行起来呢,就用到了Looper.loop()消息泵的开关,好了到这里Handler基本就明了了。

从源码理解Handler

  • 我们用Handler发送消息都是通过sendMessage()或者post()方法,最后调用的都是enqueueMessage方法。

Handler内存共享如何保证数据的安全

  • 这里就要说到一个新的角色ThreadLocal,ThreadLocal中有一个静态内部类ThreadLocalMap,他为每个线程都维护一个table数组,其中通过int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);int i = key.threadLocalHashCode & (len-1);产生一个ThreadId作为key,value就是我们发出的消息。 如果对ThreadLocal感兴趣可以看看这篇文章 ThreadLocal

Handler如何存取消息

  • MessageQueue.enqueueMessage()向消息队列添加消息,MessageQueue.next()从消息队列里取消息。
  • 由此可以看出使用了生产者消费者模式,并且还有延迟消息的添加, 就像链表一样在给消息进行重排序。

今天就先写到这明天继续?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux 下从头再走 GTK+-3.0 (一)

      原本由于项目需求在 Linux 下学习过一段时间的 GTK+2.0 图形开发,时隔一段时间,想真正深入学习一下 GTK 。

    RainMark
  • Linux 下从头再走 GTK+-3.0 (二)

    RainMark
  • Linux 下从头再走 GTK+-3.0 (三)

    RainMark
  • Linux 下从头再走 GTK+-3.0 (四)

      实际的应用中,往往有很多个控件, 同样GTK提供了很多种布局方案,Box, Fixed , Table , Grid 等。

    RainMark
  • Linux 下从头再走 GTK+-3.0 (五)

      实践中表明,纯粹利用 gtk 函数来创建 UI 是很繁琐的事,需要编写很多代码。怎样才能快速统一的建立 UI 布局呢?

    RainMark
  • Linux 下从头再走 GTK+-3.0 (六)

      在 GTK3 中增加了一个 GtkApplicaton 类,便于我们处理多窗口程序,同时有了 GtkApplication 我们也更容易创建灵活,易用,界面...

    RainMark
  • 从头完成一个restful API 服务(再续)

    安装Jenkins其实很简单的,只要下载Jenkins的WAR包,然后放到tomcat下面

    周萝卜
  • 一文读懂 Handler 机制全家桶

    Handler 在整个 Android 开发体系中占据着很重要的地位,对开发者来说起到的作用很明确,就是为了实现线程切换或者是执行延时任务,稍微更高级一点的用法...

    业志陈
  • 音视频直播技术--Android视频采集(Camera2)

    今天为大家介绍一下如何在 Android 上进行视频采集。在 Android 系统下有两套 API 可以进行视频采集,它们是 Camera 和 Camera2 ...

    音视频_李超
  • Handler的消息延时是怎么实现的

    通常我们使用Handler的消息延时都是调用sendMessageDelayed函数实现的,其中delayMillis是需要延时的毫秒。

    码农帮派
  • Go语言的网络编程简介

    本文通过 Go 语言写几个简单的通信示例,从 TCP 服务器过渡到 HTTP 开发,从而简单介绍 net 包的运用。 TCP 服务器 首先来看一个 TCP 服务...

    李海彬
  • Go语言的网络编程简介

    本文通过 Go 语言写几个简单的通信示例,从 TCP 服务器过渡到 HTTP 开发,从而简单介绍 net 包的运用。 TCP 服务器 首先来看一个 TCP 服务...

    李海彬
  • Go语言的网络编程简介

    本文通过 Go 语言写几个简单的通信示例,从 TCP 服务器过渡到 HTTP 开发,从而简单介绍 net 包的运用。 TCP 服务器 首先来看一个 TCP 服务...

    李海彬
  • Go语言的网络编程简介

    文 | 源小白 共9877字,阅读需25分钟 本文通过 Go 语言写几个简单的通信示例,从 TCP 服务器过渡到 HTTP 开发,从而简单介绍 net 包的运用...

    企鹅号小编
  • 第十七节 netty源码分析之pipeline的来源

    再看下他们的父类 AbstractChannelHandlerContext 的构造器, 分别以参数 inbound , outbound .来区分head和t...

    用户1418372
  • nginx处理http请求十一个阶段流程源码分析

    使用 ngx_http_phase_t 结构存储每个阶段可用的处理函数(handler)。

    xiaomei
  • SpringMVC 异常处理体系深入分析

    松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程

    江南一点雨
  • Linux IP in IP隧道简述

    前言:IPIP隧道是一种三层隧道,通过把原来的IP包封装在新的IP包里面,来创建隧道传输。本篇简单分析Linux(2.6.32版本)中的IPIP隧道的实现过程,...

    知忆
  • 深入了解Android的Looper

    Handler我们都知道,它需要和Looper绑定,当Handler在主线程创建,则会默认绑定主线程的Looper,当是在子线程创建,则需要在Handler的构...

    PhoenixZheng

扫码关注云+社区

领取腾讯云代金券