Handler: 主线程如何通知子线程

Java多线程 - 主线程通知子线程结束 目录 1.背景碎碎念 2. T线程类 3. main测试方法 1.背景碎碎念 希望主线程去空置T线程的中止/退出,需要有能力去修改loopFlag 让T修改Run方法,从而中止T线程,通知方式。 2. T线程类 package com.edu.threadExit_; /** * author 大力pig */ public class T extends Thread { private int count = 0; private boolean loop 阅读详情

在 android 中,不可以在子线程中更新 UI 的操作,否则会报错或者异常信息。


在这种情况下,我们会使用 Handler(在 UI 线程创建该对象) 接收子线程的消息更新 UI.


可以看出,这是子线程通知主线程,而主线程没有直接通知子线程,那麽我们如何做到这一点?这样有什么好处?
好处,很明显。主线程中如果有些耗时的操作,我们可以让子线程去做,这时,主线程就可以通知子线程了!

实现这种操作的方式有很多,今天主要想说说 HandlerThread 与 Handler 的配合使用方法。

在主线程中,可以创建 HandlerThread 对象:
        HandlerThread mHandlerThread = new HandlerThread("sub_thread");
        mHandlerThread.start();


这样,就开启了一个子线程,该线程的名字就是 sub_thread.

然后,我们实现一个继承自 Handler 的 MyHandler 类:
class MyHandler extends Handler {

        public MyHandler() {
            super();
        }

        public MyHandler(Looper looper) {
            super(looper);
        }
        
        @Override
        public void handleMessage(Message msg) {
            // super.handleMessage(msg);
            if(msg.what == MSG_WHAT) {
                Bundle bundle = msg.getData();
                String info = bundle.getString("main");
                Log.d("mark", "我接受任务:" + info);
            }
        }
    }

最后,使用 Message 来传递消息,MyHandler 会根据情况处理 Message.

完整代码:
package mark.zhang;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class HandlerThreadActivity extends Activity {

    private static final int MSG_WHAT = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // 创建对象,并启动该线程
        HandlerThread mHandlerThread = new HandlerThread("sub_thread");
        mHandlerThread.start();
        // 获取 Looper 对象
        MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());
        // 创建 Bundle 对象,传递数据
        Bundle bundle = new Bundle();
        bundle.putString("main", "我这边事情太多,麻烦你帮忙处理一下!");
        // 发送消息
        Message msg = new Message();
        msg.what = MSG_WHAT;
        msg.setData(bundle);
        msg.setTarget(mHandler);
        msg.sendToTarget();
        
        Log.d("mark", "UI----" + "threadName: " + Thread.currentThread().getName() + ",threadId: " + Thread.currentThread().getId());
    }

    /**
     * 该Handler调用 handleMessage方法运行在子线程
     * 
     * @author mark
     */
    class MyHandler extends Handler {

        public MyHandler() {
            super();
        }
        
        /* 这个构造方法必须有 */
        public MyHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MSG_WHAT) {
                Bundle bundle = msg.getData();
                // 接收消息
                String info = bundle.getString("main");
                Log.d("mark", "handleMessage---" + "threadName: " + Thread.currentThread().getName() + ",threadId: " + Thread.currentThread().getId());
                Log.d("mark", "我接受任务:" + info);
            }
        }
    }
}

这里,我们思考一个问题,代码:
 // 获取 Looper 对象
 MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());

获取 Looper 对象,使用的是 HandlerThread 对象的 getLooper 对象。为什么不直接这样:
// 获取 Looper 对象
MyHandler mHandler = new MyHandler(getMainLooper());

如果这样做的话,打印信息如下:
D/mark    (21852): UI----threadName: main,threadId: 1
D/mark    (21852): handleMessage---threadName: main,threadId: 1
D/mark    (21852): 我接受任务:我这边事情太多,麻烦你帮忙处理一下!

可见,此时的 handleMessage 是在主线程中运行的。每个主线程默认有一个 Looper,也就是说在主线程中,下面代码是等效的:

  MyHandler mHandler = new MyHandler(getMainLooper());
  MyHandler mHandler = new MyHandler();

但是子线程需要手动获取如:
MyHandler mHandler = new MyHandler(mHandlerThread.getLooper());

实现主线程、子线程双向通信可以在各自的线程中分别是用 Handler 来传递信息和处理消息。


android 主线程给子线程发送消息 这是我自己写的demo,练习在android中主线程给子线程发送消息 立即下载

相关推荐

手把手教学|用飞书+扣子工作流实现自动化批量图片生成,效率提升99%!体验完整操作流程

在先前的文章中,我们已经深入探讨了扣子智能体的多种应用场景,以及如何创建和使用工作流进行高效管理。本文将引领大家通过一个具体案例,将扣子的工作流功能嵌入飞书应用中,实现操作的自动化与高效化。

weixin_66485800的博客 6028

android开发步步为营之1:Handler让主线程和子线程进行通信

Handler 处理器,主要接受子线程发送的数据, 并用此数据配合主线程更新UI。 .net里面有httphandler这个概念,不过.net里面,这个httphandler的作用是:所有的http请求在服务器处理之前进行拦截同时做相应的处理,而android里面这个Handler,个人理解就是起桥梁的作用,When you create a new Handler, it is bound

飞在江湖的专栏 1920

5分钟搞定!用Keil MDK将STM32F103C8T6工程无缝迁移到ZET6开发板

本文详细介绍了如何在Keil MDK环境下快速将STM32F103C8T6工程迁移到ZET6开发板,涵盖硬件差异对比、工程配置调整、外设适配及编译排错等关键步骤,帮助开发者5分钟内完成工程移植,大幅提升开发效率。

weixin_30879169的博客 409

android 中主线程给子线程发消息

public class MainActivity extends Activity { private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // TODO 主线程向子线程发一个消息 setContentView(R.layout.activity_main); new Thread(ne

延成的博客 2300

Latex小白也能搞定!5分钟教你用Overleaf打造个性化简历(附免费模板)

本文为LaTeX新手提供了一份快速上手指南,教你如何在5分钟内使用Overleaf在线平台和现成模板,轻松打造专业且个性化的简历。文章详细介绍了从选择模板、替换个人信息到进行颜色、图标等个性化调整的完整流程,让你无需深入学习LaTeX语法,即可高效制作出排版精美、脱颖而出的求职简历。

2a4s6d8f0g的博客 684

深度学习模型设计的方法和技巧

设计神经网络模型是一个迭代的过程,需要不断试验和调整各个组成部分,以达到最佳性能。同时,遵循良好的工程实践,如模块化设计、版本控制、文档记录等,也是成功的关键。

xw555666的博客 4027

handler机制

handler机制:概念 handler机制是一种异步通信机制,通常用于子线程中数据更新后,通知主线程UI更新。 handler运行框架图 从上面handler的运行框架图来看,为了完成handler整个流程,你必须按事先创建好四个东西: handler、Message、MessageQueue和Looper,也许Looper从上图来看并不是必须的,因为遍历MessageQueue只是调用了一个静

jackzhouyu的专栏 852

【ARMv8 异常模型入门及渐进7 - GIC及安全中断介绍】

GIC-v3中,引入了支持2种安全状态(secure state),也就是对于中断,根据secure状态,分为安全中断和非安全中断。当然也可以只支持一种安全状态。这里的2种安全状态和1种安全状态,主要是影响中断分组,所使用IRQ和FIQ管脚的映射,以及gic中的寄存器访问。

CodingCos的博客 2116

Android Handler:主线程如何通知子线程

在 android 中,不可以在子线程中更新 UI 的操作,否则会报错或者异常信息。 在这种情况下,我们会使用 Handler(在 UI 线程创建该对象) 接收子线程的消息更新 UI. 可以看出,这是子线程通知主线程,而主线程没有直接通知子线程,那麽我们如何做到这一点?这样有什么好处? 好处,很明显。主线程中如果有些耗时的操作,我们可以让子线程去做,这时,主线程就可以通知子线程了! 实现这

AlienTech for better life!~ 2712

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

静态时序分析(STA)—— 标准单元库

目录 1、时序库 概览 2、时序模型 1、基本概念 2、影响因素 3、线性延时模型 4、非线性延时模型 5、单元时序弧 1、组合逻辑单元 2、时序逻辑单元 6、线负载模型 参考说明 上一篇,学习了 STA相关的基本概念,本篇继续学习 STA相关的 标准单元库。 1、时序库 概览 库文件概览: 2、时序模型 1、基本概念 2、影响因素 对于组合逻辑的时序弧而言,其延时的大小取决于: 1、输出负载,即,输出端的电容负载的大小。容性负载越大,...

记录所学,分享知识,结识挚友 2854

Handler: 主线程如何通知子线程(转)

      在 android 中,不可以在子线程中更新 UI 的操作,否则会报错或者异常信息。 在这种情况下,我们会使用 Handler(在 UI 线程创建该对象) 接收子线程的消息更新 UI. 可以看出,这是子线程通知主线程,而主线程没有直接通知子线程,那麽我们如何做到这一点?这样有什么好处? 好处,很明显。主线程中如果有些耗时的操作,我们可以让子线程去做,这时,主线程就可以通知子线程了...

lvlay79的博客 203

海洋浮游生物识海洋浮游生物识别系统:基于YOLOv10的显微图像自动检测与UI别系统:基于海洋浮游生物识别系统:基于YOLOv10的显微图像自动检测与UI展示YOLOv10的显微图像自动检测与UI展示

本文介绍了如何利用YOLOv10模型进行海洋浮游生物的自动识别,旨在提高传统显微镜观测的效率与准确性。研究背景强调了浮游生物在海洋生态系统中的重要性,并指出传统方法的局限性。数据集选用WHOI-Plankton,包含70多种浮游生物的20000多张带标签图像。文章详细描述了YOLOv10模型的安装、数据集配置、训练与测试步骤,并提供了基于PyQt5的图形化检测界面代码。结果显示,模型在精度、召回率和mAP@0.5等指标上表现优异,推理速度达到约30 FPS。最后,文章提出了部署建议和未来优化方向,如集成摄像

YOLO 376

Andrid异步更新UI:Handler(二)深入了解:Message你真的会创建?它是如何子线程和主线程通知?

线程分为主线程(主线程又叫UI线程)和子线程,主线程即ActivityThread,规定只有此线程能操作UI,但我们从后台请求数据,都是在子线程操作,所以需要有人帮忙把线程切换一下,所以就有了Handler。

前期后期 872

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android中的消息机制,Android面试2021

[java]  view plain copy ERROR/AndroidRuntime(421): FATAL EXCEPTION: Thread-8 ERROR/AndroidRuntime(421): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created&nbsp

m0_64319298的博客 128

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

安卓的通信机制

第一种:使用handler来进行通信    handler 大家可以把它想象成主线程(UI线程)的一个子线程,它可以给主线程(UI线程)发送数据从而更新主线程(UI线程)的UI与逻辑,handler 是一个子线程所以它的耗时操作不会阻塞主线程,大家都知道在android的开发中如果代码中某个地方阻塞主线程超过5秒的话系统会提示ANR (系统提示强制关闭)所以在耗时操作上我们可以考虑开启一个子线程

ytt199599的博客 432

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android中的通信机制总结

android中的通信机制总结 <div class="article_manage clearfix"> <div class="article_l"> <span class="link_categories"> 标签: <a href="http://www.youkuaiyun.com

hzy670800844的博客 343

Android Handler消息机制详解:从Looper、MessageQueue到源码与避坑实践

Android应用普遍采用单线程UI模型,跨线程通知主线程更新界面需要一套可靠的消息传递机制。这套机制由Handler、Looper与MessageQueue协作完成:Looper负责驱动消息循环,MessageQueue按时间组织消息,Handler负责发送与最终处理,并通过ThreadLocal保证每个线程拥有独立的Looper。理解其底层原理,有助于解决子线程创建Handler崩溃、延时消息不准、内存泄漏等高频问题,也可借助消息日志定位主线程卡顿与GC性能瓶颈。无论是日常业务开发还是性能优化,掌握消息

weixin_29189003的博客 195
上一篇: 如何完全退出单例模式下的android应用程序,非常好用
下一篇: Android SDK 中Android.net.wifi简要分析
canvas18
博客等级 码龄15年 8粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值