资讯动态

Android Handler消息机制详解

发布时间:2026/8/27 12:23:41 来源:尧图企业网站定制
在Android中只有主线程才能更新UI但是主线程不能进行耗时操作否则会产生ANR异常所以常常把耗时操作放到其他子线程进行。如果在子线程中需要更新UI一般都是通过Handler发送消息主线接收消息后进行相应的UI逻辑处理。一.什么是HandlerHandler是一个消息分发对象。 Handler是Android系统提供的一套用来更新UI的机制也是一套消息处理机制可以通过Handler发消息也可以通过Handler处理消息。二.为什么使用Handler为了解决多线程并发的问题 比如如果在一个activity中有多个线程同时更新UI并且没有加锁就会出现界面错乱的问题。但是如果对这些更新UI的操作都加锁处理又会导致性能下降。出于对性能问题的考虑Android提供这一套使用Handler更新UI的机制不用再去关心多线程的问题所有的更新UI的操作都是在主线程的消息队列中去轮询处理的。 在Android系统中只有主线程才能更新UI提到主线程就不得说一下ActivityThread一个应用内部的逻辑处理都是在ActivityThread内部依靠Handler来进行处理的比如activity、service相关的创建等相关逻辑在应用创建后会调用到ActivityThread内部的main()方法逻辑如下public static void main(String[] args) { ...... //创建Looper Looper.prepareMainLooper(); ActivityThread thread new ActivityThread(); thread.attach(false); //创建Handler if (sMainThreadHandler null) { sMainThreadHandler thread.getHandler(); } //开启loop()循环 Looper.loop(); }从上面可以看到在ActivityThread里面的main()中执行了Looper.prepareMainLooper()及Looper.loop()接下来一起分析一下Android系统的消息处理机制。三.源码分析Android内部的消息处理机制主要是由Handler、Looper、MessageQueue、Message来组成的具体分工如下 _Handler_负责发送消息及处理消息 _Looper_不断的从消息队列中取出消息并且将消息给发送本条消息的Handler _MessageQueue_负责存储消息 _Message_消息本身负责携带数据1.LooperLooper分为主线程和其他子线程前面讲到主线程的Looper是在进程启动后调用ActivityThread的main()里面通过prepareMainLooper()创建的a.prepareMainLooper()public static void prepareMainLooper() { prepare(false); synchronized (Looper.class) { if (sMainLooper ! null) { throw new IllegalStateException(The main Looper has already been prepared.); } sMainLooper myLooper(); } }prepareMainLooper()内部会调用prepare(false)来进行创建且Looper是不能退出的然后对sMainLooper进行赋值b.prepare()//只能通过Looper.prepare()方法去初始化一个Looper public static void prepare() { prepare(true); } //一个线程中只能有一个Looper对象否则在第二次尝试初始化Looper的时候就会抛出异常 private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() ! null) { throw new RuntimeException(Only one Looper may be created per thread); } sThreadLocal.set(new Looper(quitAllowed));//创建了new Looper }子线程通过prepare()内部调用prepare(true)来创建对应的Looper且Looper是可以退出的为什么要退出后面会讲到public static Nullable Looper myLooper() { return sThreadLocal.get(); } private Looper(boolean quitAllowed) { //创建Looper的时候会创建一个MessageQueue mQueue new MessageQueue(quitAllowed); mThread Thread.currentThread(); }Looper构造方法内会创建MessageQueue()为后续消息处理做准备然后获取到当前的Thread赋值给mThread后续通过getThread()可以获取到当前的thread可以用来判断是否为主线程。最后给大家分享这份腾讯技术团队出品的《Android Framework 开发揭秘》总共有19万字包含109个知识点通过经典Binder、Handler、AMS等源码解析加深你对Android Framework框架层的理解。《Android Framework 开发揭秘》第一章 系统启动流程分析第一节 Android启动概览第二节 init.rc解析第三节 Zygote第四节 面试题第二章 Binder解析第一节 宏观认识Binder第二节binder的jni方法注册第三节binder驱动第四节 数据结构第五节 启动service_manager第六节获取service_manager第七节 addService流程第八节 Binder面试题全解析第三章 Handler解析第一节 源码分析第二节 难点问题第三节Handler常问面试题第四章 AMS 解析第一节 引言第二节 Android架构第三节 通信方式第四节 系统启动系列第五节 AMS第六节 AMS 面试题解析第五章 WMS解析第一节Activity与Window相关概念第二节 Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析第三节Android窗口管理服务WindowManagerService对窗口的组织方式分析第四节 Android窗口管理服务WindowManagerService对输入法窗口的管理分析第五节 Android窗口管理服务WindowManagerService对壁纸窗口的管理分析…第六章PKMS Android10.0 源码解读第一节 前言 PKMS 是什么东西第二节 PKMS 概述信息第三节 PKMS角色位置第四节 PKMS 启动过程分析第五节 APK的扫描第七节 PMS之权限扫描第八节 PackageManagerService大综合笔记朋友们如果需要这份完整版的资料合集点击文末CSDN官方认证微信卡片免费领取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价