【Android开发基础】多线程-Handle消息机制

news2024/11/20 3:32:19

文章目录

    • 一、引言
    • 二、认识
      • 1、为什么要用Handle
      • 2、原理图
      • 3、关键对象
        • (1)Message(消息类)
        • (2)Handler(消息机制)
        • (3)MessageQueue(消息处理类)
        • (4)Looper(循环类)
    • 三、使用
      • 1、UI设计
      • 2、实现代码
    • 四、附件

一、引言

  • 描述:一个静态的UI界面,如果需要同时加载多个资源,并能在视觉上得到动态反馈,就需要用到Handle消息机制。
  • 知识点:Handle消息机制
  • 难度:初级
  • 理解
    在这里插入图片描述

二、认识

1、为什么要用Handle

根据官方规则:子线程不允许操作主线程中的组件

2、原理图

基础原理图

3、关键对象

(1)Message(消息类)

        Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。

属性类型描述
arg1int用来存放整型数据
arg2int用来存放整型数据
objObject用来存放发送给接收器的Object类型的任意对象
replyToMessenger用来指定此Message发送到何处的可选Messager对象
whatint用于指定用户自定义的消息代码,这样接收者可以了解这个

(2)Handler(消息机制)

        Handler主要用于发送消息和处理消息。一般使用Handelr对象的sendMessage()方法发送消息,消息经过一系列处理后,最终会传递到Handler的handlerMessage()方法中。

(3)MessageQueue(消息处理类)

        MessageQueue是消息队列的意思,它主要用来存放通过Handler发送的
消息。通过Handler发送的消息会存在MessageQueue中等待处理。

方法描述
handleMessage(Message msg)处理消息的方法。通常重写该方法来处理消息,在发送消息时,该方法会自动回调
post(Runnable)立即发送Runnable对象,该Runnable对象最后将被封装成Message对象
postAtTime(Runnable r, long uptimeMillis)定时发送Runnable对象,该Runnable对象最后将被封装成Message对象
postDelayed(Runnable)延迟多少毫秒发送Runnable对象,该Runnable对象最后将被封装成Message对象
sendEmptyMessage(int)发送空消息
sendMessage(Message msg)立即发送消息
s endMe ss ageAtTime (Me ss age msg, longuptimeMillis)定时发送消息
sendMessageDelayed(Message msg, longdelayMillis)延迟多少毫秒发送消息

(4)Looper(循环类)

        Looper是每个线程中的MessageQueue的管家。调用Looper的loop()方法后,就会进入到一个无线循环中。然后一发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的HandlerMessage()方法中。

方法描述
prepare()用于初始化Looper
loop()调用loop()方法后,Looper线程就开始真正工作了,它会从消息队列里获取消息和处理消息
myLooper()可以获取当前线程的Looper对象
getThread()用于获取Looper对象所属的线程
quit()用于结束Looper循环

三、使用

以单个子线程为例:进度条

进度GIF

1、UI设计

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ProgressBar
        android:id="@+id/progress"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="180dp"
        android:layout_height="40dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="111dp"
        android:layout_marginBottom="382dp"
        android:max="100" />

    <TextView
        android:id="@+id/math"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="-5dp"
        android:layout_marginBottom="387dp"
        android:gravity="center"
        android:textSize="25dp"
        android:textColor="#F44336"/>

</RelativeLayout>

2、实现代码

    final int TIME = 100;
    final int TIME_GAS = 0x11;
    float MATH = 0;
    private ProgressBar time;
    private int mTIME = 0;
    ProgressBar progressBar;
    TextView math;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar = findViewById(R.id.progress);
        math = findViewById(R.id.math);

        handler.sendEmptyMessage(TIME_GAS);
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if (mTIME<TIME){
                mTIME += 1;
                MATH += 1;
                String Imath = String.valueOf(MATH) + "%";
                math.setText(Imath);
                progressBar.setProgress(mTIME);
                handler.sendEmptyMessageDelayed(TIME_GAS,10);
            } else {
                Toast.makeText(MainActivity.this,"进度完成!!",Toast.LENGTH_SHORT).show();
            }
        }
    };

四、附件

git下载地址:https://gitee.com/xu-pq/android-demo/tree/master/Android_Handler

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻量级报表解决方案Telerik Reporting,轻松完成嵌入式报表交互!

开发者可以通过多种方式与集成在应用程序中的Telerik报表进行交互&#xff0c;从“只是阅读它”到更改报表中包含的数据。 但是要注意&#xff1a;开发者所能做的一些事情将取决于报表是如何创建的&#xff0c;以及它是如何嵌入到应用程序UI中的。因此(和任何应用程序一样)&am…

关于数据库SQL优化

简介 在项目上线初期&#xff0c;业务数据量相对较少&#xff0c;SQL的执行效率对程序运行效率的影响可能不太明显&#xff0c;因此开发和运维人员可能无法判断SQL对程序的运行效率有多大。但随着时间的积累&#xff0c;业务数据量的增多&#xff0c;SQL的执行效率对程序的运行…

假如不干技术,多年学的知识会不会白费?

【1】 有位匿名朋友&#xff0c;在星球中提问&#xff1a; 沈老师&#xff0c;作为一个开发&#xff0c;如果离开了公司&#xff0c;不再做技术&#xff0c;感觉这么多年学的知识都白费了&#xff0c;什么都用不上了&#xff0c;你怎么看&#xff1f; 我的一些思考&#xff0c;…

智能驾考远程监控方案4G工业路由器物联网应用

随着全民经济增长生活水平提高&#xff0c;汽车保有量也随之增长&#xff0c;需要驾驶机动车前提是需要经过标准的驾考培训获得机动车驾驶证后&#xff0c;才能够驾车上路。参加过驾考的朋友们都知道&#xff0c;科目一与科目四都是上机考试&#xff0c;而科目二和科目三则是在…

C#实战:Dapper操作PostgreSQL笔记

目录 一、PostgreSQL简介 二、PostgreSQL组成 三、PostgreSQL的主要优点 四、PostgreSQL的使用场景 五、示例 1、安装dapper&#xff0c;目前本案例安装的版本是1.50.2 2、安装PostgreSQL驱动 3、数据库链接示例 4、通过SQL查询数据列表写法 5、插入示例写法 一、PostgreSQL简介…

Triton教程 -- 快速开始

Triton教程 – 快速开始 文章目录 Triton教程 -- 快速开始创建模型存储库启动 Triton在带 GPU 的系统上运行在纯 CPU 系统上运行验证 Triton 是否正常运行发送推理请求 Triton 推理服务器的新手&#xff0c;想快速部署您的模型吗&#xff1f; 利用这些教程开始您的 Triton 之旅…

FasterTransformer 004 open_attention.h forward

initialize forward() https://github1s.com/NVIDIA/FasterTransformer/blob/v1.0/fastertransformer/cuda/open_attention.h#L149-L217 使用cuBLAS库执行矩阵乘法运算&#xff0c;并对cublasGemmEx&#xff08;&#xff09;进行三个单独的调用。这些操作包括将属性核与输入张…

<Linux开发>驱动开发 -之-内核定时器与中断

&#xff1c;Linux开发&#xff1e;驱动开发 -之-内核定时器与中断 交叉编译环境搭建&#xff1a; &#xff1c;Linux开发&#xff1e; linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下&#xff1a; &#xff1c;Linux开发&#xff1e; -之-系统移植 uboot移植过程详…

Linux系统下安装Kubernetes(超详细。。。)

一、安装Kubernetes前的准备 1.1 准备Hosts文件 &#xff08;注意&#xff0c;请根据Linux虚拟机的IP地址&#xff0c;修改以下命令后再执行&#xff09; cat >>/etc/hosts<<EOF 192.168.100.146 deploy EOF 1.2 检查虚拟机的hostname cat /etc/hostname验证…

Charles抓包配置

这里写目录标题 一、Windows抓包配置1、Help-SSL Proxying-install Charles Root Certificate2、安装并导入证书&#xff0c;按下方各图完成证书导入后&#xff0c;正常情况下&#xff0c;会显示该证书没有问题。3、SSL证书过期解决办法a、可在windows的设置中搜索证书关键字&a…

c++ nlohmann/json 及修改json文件中个别关键字

(2条消息) nlohmann json使用_nlohmann::json_蜗牛单行道的博客-CSDN博客json为JavaScript object notation 是一种数据格式&#xff0c;逐渐替换掉了传统的xml 。json数据格式的属性名称和字符串值需要用双引号引起来&#xff0c;用单引号或者不用引号会导致读取数据错误。jso…

Django-初

文章目录 一、Django框架介绍二、后台管理第一步:项目的创建与运行第二步:应用的创建和使用第三步: 项目的数据库模型第四步: 启用后台Admin站点管理 三、前台管理第一步: URLconf 路由管理第二步: 视图函数处理业务逻辑第三步: 模板管理实现好看的HTML页面&#xff08;可参考菜…

网络计算模式期末复习(一)

C/S架构 C/S架构即客户端/服务端架构。客户端包含一个或多个在用户电脑上运行的程序&#xff0c;客户端程序发送请求和从服务器接收的数据。服务器端主要提供数据管理、数据共享、数据及系统维护和并发控制等。 B/S架构 B/S架构即浏览器/服务器架构&#xff0c;是随着Intern…

图片上添加贴纸怎么做?这几种方法很简单

在图片上添加贴纸是一种非常实用的图片编辑技巧&#xff0c;通过添加贴纸&#xff0c;图片可以变得更加生动有趣&#xff0c;吸引人们的眼球。贴纸可以是各种形状、颜色和大小&#xff0c;从而丰富图片的视觉效果。例如&#xff0c;在一张风景照片中添加一只卡通动物的图案&…

python中golbal的使用

简介 global关键字定义了一种在局部定义全局变量的方法 python中变量分为全局变量和局部变量&#xff0c;局部变量也叫做内部变量内部变量只能被内部使用&#xff0c;无法被其他函数或者对象使用 使用 简单使用 def fn():global fn_varfn_var "Hello World"fn1()…

为什么网红餐饮都做不长久?如何解决网红餐饮店所面临的问题?

随着社交媒体的兴起&#xff0c;网红餐饮在近年来越来越受到人们的关注。这些网红餐饮通常有着独特的装修风格、口味或者服务方式&#xff0c;吸引了大量的消费者前来体验。然而&#xff0c;有越来越多的网红餐饮因为各种原因而不得不倒闭&#xff0c;这引发了人们对于网红餐饮…

cajviewer怎么转换成pdf格式,分享几个方法给大家!

CAJViewer是一款常用的文献阅读软件&#xff0c;它主要用于打开和阅读中国知网等数据库中的CAJ格式文件。然而&#xff0c;有时候我们可能需要将这些CAJ文件转换为PDF格式&#xff0c;以便更方便地与他人分享或者进行打印。本文将介绍两到三种将CAJViewer文件转换为PDF格式的方…

华为OD机试真题2022Q4 A + 2023 B卷(JavaJavaScript)

大家好&#xff0c;我是哪吒。 五月份之前&#xff0c;如果你参加华为OD机试&#xff0c;收到的应该是2022Q4或2023Q1&#xff0c;这两个都是A卷题。 5月10日之后&#xff0c;很多小伙伴收到的是B卷&#xff0c;那么恭喜你看到本文了&#xff0c;抓紧刷题吧。B卷新题库正在更…

建站记录1:开通阿里云,购买域名,安装宝塔+LAMP系统

个人建站&#xff1a; 因为宝塔系统&#xff08;https://www.bt.cn&#xff09;&#xff0c;可以方便的部署zblog 彩色背景 什么是LAMP&#xff1f; Linux Apache PHP MySQL LAMP 是指Linux&#xff08;操作系统&#xff09; Apache &#xff08;HTTP 服务器&#xff09;…

batch_size对精确度和损失的影响

1 问题 在深度学习的学习过程中&#xff0c;模型性能对batchsize虽然没有学习率那么敏感&#xff0c;但是在进一步提升模型性能时&#xff0c;batch_size就会成为一个非常关键的参数。 batch_size对精度和损失的影响研究。 batch_size [,32,64,128&#xff0c;256] 不同batch_…