Looper如何知道将消息发送给Handler?

2024-01-08

问题是,我告诉我的线程使用mHandler为了Looper?

谢谢。 我正在使用下面的代码:

class LooperThread extends Thread {
    public Handler mHandler;
    public void run() {
      Looper.prepare();

      mHandler = new Handler() {
          public void handleMessage(Message msg) {
              // process incoming messages here
          }
      };

      Looper.loop();
    }
}

问题是,我在哪里告诉我的线程使用 mHandler 循环者?

你不需要明确地告诉它,因为系统(框架)会为你做这件事。当你实例化Handler,它会自动获取你当前的消息队列的访问权限Thread。引用你的评论:

系统如何知道将消息发送到mHandler Handler?

下面我将详细介绍。

这是构造函数android.os.Handler在安卓中:

    mLooper = Looper.myLooper();
    if (mLooper == null) {
        throw new RuntimeException(
            "Can't create handler inside thread that has not called Looper.prepare()");
    }
    mQueue = mLooper.mQueue;

正如你所看到的,首先它获得了Looper您当前的Thread。的源代码Looper.myLooper()如下:

public static final Looper myLooper() {
    return (Looper)sThreadLocal.get();
}

它从线程本地存储中获取它。稍后,当您发送Message有了这个Handler, the Handler实际上将自己设置为接受者 of the Message: 是这样的Looper将知道将其发送到哪里Message当它到达时。详细信息:

你打电话时mHandler.sendMessage(),最终此代码运行(以及许多其他代码行):

    MessageQueue queue = mQueue;
    boolean sent = false;
    if (queue != null) {
        msg.target = this; // msg is your Message instance
        sent = queue.enqueueMessage(msg, uptimeMillis);
    }

正如你所看到的,它设置了Handler实例作为目标Message。所以,后来,当Message被发送时,它将包含Handler作为其目标。这就是如何Looper就会知道哪个Handler它应该将其发送到。详细信息,当您致电Looper.loop(),您的每个人都会发生以下情况Message队列中的实例:

msg.target.dispatchMessage(msg);

The dispatchMessage()代码如下:

public void dispatchMessage(Message msg) {
    if (msg.callback != null) {
        handleCallback(msg);
    } else {
        if (mCallback != null) {
            if (mCallback.handleMessage(msg)) {
                return;
            }
        }
        handleMessage(msg);
    }
}

注意last handleMessage(msg)打电话——这正是你的handleMessage(msg)覆盖!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Looper如何知道将消息发送给Handler? 的相关文章

随机推荐

  • 如何在量角器中等待元素启用

    尝试单击按钮时量角器失败 最初 该按钮将处于禁用状态 稍后它将被启用 量角器认为该按钮已准备好并单击该按钮并失败 所以我希望量角器脚本等到按钮启用 我在下面尝试过 但没有成功 有人可以发布完整的代码来等待该元素被启用吗 expect bro
  • Apple 是否提供其使用的本地化术语索引?

    Apple 是否为开发者提供了一套不同语言的标准术语 我之所以问这个问题 是因为我正在对应用程序的部分内容进行本地化 并且希望在整个应用程序中一致应用标准术语 我采用了一些策略 通过更改设备上的语言并观察 Apple 如何用其他语言解释这些
  • 从 R 读取 .npz 文件

    I save npz来自 Python 的文件并想在 R 中读取它 我尝试使用npyLoad功能 但我收到此错误 library RcppCNPy Data lt npyLoad xx npz Error in npyLoad xx npz
  • 在 Objective-C 中封装 C 库的技巧

    我有一个用 C 编写的库 我想在 Mac 或 iPhone 上的 Objective C 应用程序中使用它 不幸的是 由于该库是由开源领域的个人编写的 因此文档非常稀疏且不完整 虽然我可以弄清楚如何使用库中的内容 但我并没有真正了解整个代码
  • 使用常量内存在 O(n) 内对 BST 进行排序

    这不是作业 只是一个有趣的任务 给定一个由数组表示的完全二叉搜索树 使用常量内存在 O n 内对数组进行排序 Example Tree 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 阵列 8 4 12 2 6 10
  • ASP.NET MVC - 如何从不同的控制器维护 ModelState?

    我有一个带有 Index 操作的 HomeController 该操作显示 Index aspx 视图 它有一个用户名 密码登录部分 当用户单击提交按钮时 它会 POST 到 AccountController 中的登录操作 在此操作中 它
  • 如何处理 Rails 应用程序的长请求,以便其他用户不会延迟太多?

    我在 Heroku 上有一个免费的 Rails 应用程序 它最近开始吸引一些用户 我的应用程序中的一个事件涉及查询另一个 API 最多可能需要 10 秒才能完成 如何确保同时访问简单页面的其他用户 作为另一个用户的 API 事件 不需要等待
  • 通过点击另一个标签来更改 html 标签的样式

    我有以下代码 parentAppliance 是主左侧导航表的一部分 将鼠标悬停在 Appliance 上时 我会看到一个包含 health 的子表 现在我希望当我点击健康时子表消失 有什么想法吗 CSS childAppliance di
  • 如何从源树中删除所有存储的密码

    我想从 SourceTree 中删除所有存储的密码 有什么办法可以删除所有的用户名和密码吗 None
  • 正则表达式随后捕获字符之前的第一个单词 - Postgresql

    参考这个问题 https stackoverflow com questions 66153909 regex capture first words before character subsequently 66154015但现在在 p
  • 如何创建在测试 Web 应用程序时使用的自签名 SSL 证书

    如何创建自签名 SSL 证书供 Apache 服务器在测试 Web 应用程序时使用 如何创建自签名 SSL 用于测试目的的证书 from http httpd apache org docs 2 0 ssl ssl faq html sel
  • Serilog 记录器接收器的最小和最大级别

    我们发现restrictedToMinimumLevel属性存在于 Serilog 中 但它是否也支持最大级别属性 之前我们已经使用过NLog其具有最小和最大日志记录级别 https github com NLog NLog wiki Co
  • 在编译时将 std::array 转换为另一种数据类型?

    C 11 中是否有一种方法可以在编译时将一种类型的数组转换为另一种数据类型 include
  • CSS 指针事件 – 接受拖动,拒绝点击

    太棒了 我需要一个元素来注册拖放指针事件 但将单击和其他指针事件传递给其后面的元素 我正在使用 React 构建拖放照片上传功能react dropzone https react dropzone netlify com 我想要dropz
  • 无法在 View SQL Server 2005 上执行删除

    我无法对视图执行删除 各个桌子上的一切都运行良好 EDIT1 添加触发器 CREATE TRIGGER myTrigger ON ViewName INSTEAD OF DELETE AS DELETE FROM ViewName WHER
  • 在 PyTorch 中使用焦点损失处理不平衡数据集

    我发现这个实现focal loss在 GitHub 中 我使用它来解决不平衡数据集二元分类问题 IMPLEMENTATION CREDIT https github com clcarwin focal loss pytorch class
  • 在 Android 模拟器中安装 Android 版 Chrome

    我想在 Android 模拟器 运行 Windows 7 64 位 上安装 Android 版 Chrome 我尝试从模拟器访问 Google Play 市场 但它不允许我安装 我尝试安装适用于 Android 的 chrome APK 从
  • 空值powershell数组

    我有一个奇怪的问题 这是我的 CSV Serveur Carte Cordon IP Mac Vmnic Vmnic mac Connect Port Dexter eth1 405 172 16 5 117 00 24 e8 36 36
  • 是否可以使用 CSS 在边距之外添加边框?

    我很确定已经有人问过这个问题了 但我在谷歌或这里找不到它 我只是好奇 CSS 在这方面的局限性 是否可以使用 CSS 在边距之外添加元素的边框 基本上 我希望将边框放置在边距之外 而不是填充之外 我了解盒子模型在 CSS 中的工作原理 因此
  • Looper如何知道将消息发送给Handler?

    问题是 我告诉我的线程使用mHandler为了Looper 谢谢 我正在使用下面的代码 class LooperThread extends Thread public Handler mHandler public void run Lo