首页 > 其他分享 >Handler基本使用

Handler基本使用

时间:2024-05-29 22:48:09浏览次数:21  
标签:基本 创建 Handler 线程 消息 使用 msg Message

Handler使用

一、相关概念

Handler是一套消息传递机制,通常的作用是在多线程的应用场景中,将子线程(工作线程)中需要更新UI的相关信息传递到主线程,从而实现工作线程对UI的更新。

概念 定义 作用 备注
主线程
(UI线程、MainThread)
应用程序首次开启时会自动开启一条线程,其实就是主线程 处理和UI相关操作 不可进行耗时操作
子线程
(工作线程)
手动开启的线程 主要进行耗时操作 子线程通过Handler与主线程通信
消息
(Message)
线程间通信的数据单元 存储通信信息
消息队列
(Message Queue)
一种先进先出的数据结构
(底层是单向链表实现)
存储和管理Handler发送来的消息 创建Looper时同时创建Message Queue
处理者
(Handler)
子线程和主线程通信的媒介
线程信息的主要处理者
添加消息队列
处理Looper分发过来的消息
创建Handler时,Looper必须存在
循环器
(Looper)
消息队列与Handler的通信媒介 无限循环
获取消息:从消息队列取出消息
分发消息:将取出消息分发给对应Handler
每个线程最多只能对应一个Looper(只能创建一次)
一个Looper可以被多个Handler绑定
一个Handler只能绑定一个Looper

二、使用方式

Handler的使用方式可以根据发送消息的方式不同而分为两种:

Handler.sendMessage和Handler.post()

三、使用步骤

方式一:使用Handler.sendMessage()

根据创建Handler的方式不同,又可分两种:创建Handler子类、使用匿名Handler内部类,但本质都是相同的,都是继承Handler类创建子类

创建Handler子类:

1.自定义Handler子类,并重写handleMessage()方法

static class MyHandler extends Handler {

        WeakReference<Activity> weakReference;

        public MyHandler(Activity activity){
            weakReference = new WeakReference<>(activity);
        }

        //重写handleMessage()方法
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (weakReference.get() == null) {
                //activity被回收
                return;
            }
            //执行的UI操作
        }
    }

2.主线程创建Handler实例

private MyHandler myHandler = new MyHandler(this);

3.在子线程中创建需要发送的消息对象

Message msg = Message.obtain();
msg.what = 1;

4.在子线程中通过Hander发送消息到消息队列

myHandler.sendMessage(message);

5.启动子线程

使用匿名Handler子类:

1.在主线程中通过匿名内部类创建Handler类对象

Handler mhandler =  new Handler(){
    //重写handleMessage()方法
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        //执行的UI操作 
    }
};

2.在子线程中创建需要发送的消息对象

Message msg = Message.obtain();
msg.what = 1;

3.在子线程中通过Hander发送消息到消息队列

mhandler .sendMessage(msg);

4.启动子线程

方式二:使用Handler.post()方法

1.在主线程中创建Handler实例

private Handler mhandler = new Handler();

2.在子线程中使用Handler.post()发送消息

 mhandler.post(new Runnable() {
            @Override
            public void run() {
                //执行的UI操作
            }
        });

3.启动子线程

标签:基本,创建,Handler,线程,消息,使用,msg,Message
From: https://www.cnblogs.com/allen12/p/18221273

相关文章

  • Git使用笔记
    Git使用笔记什么是git,git介绍和svc对比https://fishc.com.cn/forum.php?mod=viewthread&tid=71107&extra=page%3D1%26filter%3Dtypeid%26typeid%3D599 https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000 git安装(win)下载安装包https://git-scm.com/downl......
  • 【高端精品】外面收费2980的微信小程序拼多多+京东全自动掘金挂机项目, 单机一天轻松30
    在这个数字化时代,有一种新型的网络赚钱方式逐渐兴起,那就是通过自动化脚本来浏览微信小程序版的拼多多商品,从而帮助商家提高商品的曝光率。这种方法不仅简单易行,而且收益可观,成为不少人的新宠。想象一下,你只需要在电脑上安装一个专门的脚本,它就能自动打开拼多多小程序,并快......
  • Kotlin 标准函数 with、run、apply 的定义和使用
    Kotlin标准函数 with、run、apply 的定义和使用1. with 函数定义:with 函数允许你在一个对象的上下文中执行一个lambda表达式,而不需要在lambda表达式中重复引用该对象。@kotlin.internal.InlineOnlypublicinlinefun<T,R>with(receiver:T,block:T.()->R......
  • Ant Design Pro使用过程中遇到的一些问题
    AntDesignPro安装过程#使用npmnpmi@ant-design/pro-cli-g(这个是安装pro-cli但是这个会直接安装新版本会导致没法选择umi,npminstall-g@ant-design/[email protected]可以用)procreatemyapp(myapp是工厂名称,如果报错,用下面的命令)npxprocreatemyapp1.【Error】初始......
  • WPF使用事件聚合器,实现任意页面跨页通信
    前言:最近几天有好几个小伙伴玩WPF,遇到不同页面,不知道要怎么传递消息。于是,我今天就来演示一个事件聚合器的玩法,采用prism框架来实现。作为福利,内容附带了主页面打开对话框时候直接通过参数传递消息的一个小例子,具体请自行围观。以下内容,创建wpf项目以及引用prism和实现依赖注入......
  • 使用python绘制一个五颜六色的爱心
    使用python绘制一个五颜六色的爱心介绍效果代码介绍使用numpy与matplotlib绘制一个七彩爱心!效果代码importnumpyasnpimportmatplotlib.pyplotasplt#Heartshapefunctiondefheart_shape(t):x=16*np.sin(t)**3y=13*np.cos(t)-5*......
  • GD32 使用ST-Link进行调试出现Error:Flash Download Failed-“Cortex-M3“ 解决方案
    项目场景:原来一直使用STM32,最近有个项目发项工程师打板采用的是GD32,外部引脚是一一对应的,STM32的各种下载工具和方法也是基本相同的。问题描述`前期就是库函数和芯片包要改成GD32的。前期工作都完成了,剩下最后一公里,就是下载程序。在MDK5中,采用STLINK,选好芯片型号,准备下载,但出现了Error:FlashDow......
  • cadical基本数据结构分析2
       1.文字、变元变元和文字iteration: vars,litsvals: signedchar*vals;//assignment[-max_var,max_var]//Internal数据成员,保存文字的赋值-同时其对应负文字的赋值也一并保存(更新)。//可以理解......
  • 使用qtranslator遇到的坑
    需求:使用Qt+C++的项目支持中/英文界面Qt:QTranslator类头文件:#include<qtranslator.h>要翻译的语句都要加上tr("待翻译的内容")不属于Qt部分的类需要继承QObject后使用tr();classCGlobalVariant:QObject{ Q_OBJECT}生成ts文件网上找到生成ts文件的一种方法是使......
  • Vue3使用Composition API实现响应式
    title:Vue3使用CompositionAPI实现响应式date:2024/5/29下午8:10:24updated:2024/5/29下午8:10:24categories:前端开发tags:Vue3CompositionRefsReactiveWatchLifecycleDebugging1.介绍CompositionAPI是Vue.js3中新增的一组API,用于在组件中组合逻辑......