【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )

简介: 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )

文章目录

一、主线程中的 Handler 与 Looper

二、Handler 原理简介





一、主线程中的 Handler 与 Looper


Android 系统中 , 点击图标启动一个应用进程 , 就是从 Linux 的 Zygote 进程 fork 一个子进程 , 之后该子进程就会创建 ActivityThread , 执行其中的 main 函数 , 该 main 函数就是应用的主线程 ;



Android 的主线程在 ActivityThread 中创建并维护 , 在该类中的 main 函数 , 就是 Activity 中的主函数 ;


在该主函数中 , 调用 Looper.prepareMainLooper() 准备主线程 Looper ;


在最后的地方调用 Looper.loop() , 无限循环消息队列中的消息 ;


public final class ActivityThread extends ClientTransactionHandler {
  public static void main(String[] args) {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
        // CloseGuard defaults to true and can be quite spammy.  We
        // disable it here, but selectively enable it later (via
        // StrictMode) on debug builds, but using DropBox, not logs.
        CloseGuard.setEnabled(false);
        Environment.initForCurrentUser();
        // Set the reporter for event logging in libcore
        EventLogger.setReporter(new EventLoggingReporter());
        // Make sure TrustedCertificateStore looks in the right place for CA certificates
        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
        TrustedCertificateStore.setDefaultUserDirectory(configDir);
        Process.setArgV0("<pre-initialized>");
  // 获取主线程 Handler 对应的 Looper 
        Looper.prepareMainLooper();
        // Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.
        // It will be in the format "seq=114"
        long startSeq = 0;
        if (args != null) {
            for (int i = args.length - 1; i >= 0; --i) {
                if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
                    startSeq = Long.parseLong(
                            args[i].substring(PROC_START_SEQ_IDENT.length()));
                }
            }
        }
        ActivityThread thread = new ActivityThread();
        thread.attach(false, startSeq);
        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }
        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }
        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
  // 无限循环获取任务并执行 
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }
}



源码参考 : android/9.0.0_r8/xref/frameworks/base/core/java/android/app/ActivityThread.java






二、Handler 原理简介


Handler 主要作用是 , 用于 线程间通信 ,


在线程 A AA 中创建 Handler , 在其它线程中使用 Handler 对象发送消息给 A AA 线程的 MessageQueue 消息队列 ,


线程 A AA 中的 Looper 不停地从 消息队列 ( MessageQueue ) 中取出 Message 消息 , 然后进行分发 ;



在线程 A AA 中使用 Handler , 首先要调用 Looper.prepare()方法 , 该方法的作用是准备轮询器 ,


Looper 创建后 , 会放在 ThreadLocal 中 , 这是线程的变量表 , 每个线程都有一个线程 ThreadLocal ,


使用线程 A AA 时 , 拿到 A AA 线程的 Looper , 在其它线程中调用 Handler 的 sendMessage 方法 ,


将消息传递给线程 A AA 中的 消息队列 ( MessageQueue ) 中 ,


Looper 中维护了一个 消息队列 ( MessageQueue ) , MessageQueue 封装在 Looper 中 ;



更多细节参考 : 【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )


目录
相关文章
|
30天前
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
38 2
|
11天前
|
缓存 Java 数据库
Android的ANR原理
【10月更文挑战第18天】了解 ANR 的原理对于开发高质量的 Android 应用至关重要。通过合理的设计和优化,可以有效避免 ANR 的发生,提升应用的性能和用户体验。
34 8
|
14天前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
17天前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
41 1
|
21天前
|
消息中间件 存储 Java
Android消息处理机制(Handler+Looper+Message+MessageQueue)
Android消息处理机制(Handler+Looper+Message+MessageQueue)
43 2
|
Android开发
Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行。         比如,一个加载网络图片的的方法,需要在子线程中执行。 /** * 加载网络图片 */ private void loadImage() { ...
1267 0
|
7天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
5天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
18 5
|
4天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
5天前
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
16 3