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

这篇具有很好参考价值的文章主要介绍了【Android开发基础】多线程-Handle消息机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、引言

  • 描述:一个静态的UI界面,如果需要同时加载多个资源,并能在视觉上得到动态反馈,就需要用到Handle消息机制。
  • 知识点:Handle消息机制
  • 难度:初级
  • 理解
    【Android开发基础】多线程-Handle消息机制

二、认识

1、为什么要用Handle

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

2、原理图

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

3、关键对象

(1)Message(消息类)

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

属性 类型 描述
arg1 int 用来存放整型数据
arg2 int 用来存放整型数据
obj Object 用来存放发送给接收器的Object类型的任意对象
replyTo Messenger 用来指定此Message发送到何处的可选Messager对象
what int 用于指定用户自定义的消息代码,这样接收者可以了解这个
(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循环

三、使用

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

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

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文章来源地址https://www.toymoban.com/news/detail-489141.html

到了这里,关于【Android开发基础】多线程-Handle消息机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android之handler消息处理机制详解

    handler是什么? ​ Handler是一个在消息处理机制中负责发送和处理消息的类,是消息处理的关键。 Handler:负责 发送消息 和处理消息 Looper:内置一个死循环,可以不断的 取出消息 并通知handler处理消息,是handler起作用的基础 Message:消息实体类 MessageQueue:消息队列,负责存储消

    2024年02月04日
    浏览(50)
  • RabbitMQ--基础--8.1--消息确认机制--接受确认机制(ACK)

    代码位置 消费者收到Queue中的消息,但没有处理完成就宕机的情况,这种情况下就可能会导致消息丢失。 为了避免这种情况发生,我们可以要求消费者在消费完消息后发送一个回执给RabbitMQ,RabbitMQ收到消息回执(Message acknowledgment)后才将该消息从Queue中移除。 如果RabbitMQ没有收

    2024年02月10日
    浏览(51)
  • Android源码解析--享元设计模式,handler消息传递机制(基于Android API 33 SDK分析)

    使用共享对象可有效地支持大量的细粒度的对象 核心:对象复用。 1.1 享元模式Demo 火车票购票Demo 缓存对象在一个Map中。下面我们还会分析 用法 跟进去 这就是最明显的一个享元设计模式。 Android 开发一个知识点:UI 不能够在子线程中更新。 我们跟进post函数 Handler 传递了一个

    2024年02月11日
    浏览(35)
  • QT基础教程之八Qt消息机制和事件

    Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。 QPainter 用来执行绘制的操作; QPaintDevice 是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间; QPaintEngi

    2024年02月10日
    浏览(54)
  • QT基础教程之七Qt消息机制和事件

    事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。 在前面我们也曾经简

    2024年02月10日
    浏览(37)
  • 【STM32&RT-Thread零基础入门】 7. 线程创建应用(多线程运行机制)

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 本章进一步研究多线程的运行机制。要求实现功能如下:创建2个线程,线程名称分别为LED和BEEP。两个线程的任务是连续5次打印本线程的名字后退出线程(注意:线程不执行

    2024年02月03日
    浏览(37)
  • 【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

    🎉🎉 欢迎光临,终于等到你啦 🎉🎉 🏅我是 苏泽 ,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.

    2024年03月15日
    浏览(53)
  • Android 基础技术——Binder 机制

    笔者希望做一个系列,整理 Android 基础技术,本章是关于Binder 机制 什么是Binder 机制:Binder 是一种进程间通信机制 驱动:Binder 是一个虚拟物理设备驱动 应用层:Binder 是一个能发起通信的 Java 类 为什么要使用Binder 图解析: 性能上:  binder小于共享内存 优于其他ipc 共

    2024年02月19日
    浏览(36)
  • CAD 二次开发-Handle

    在 CAD 二次开发中, Handle 是每个 CAD 实体的唯一标识符,类似于一个 ID。它是一个 long 类型的整数,可以用于标识和引用 CAD 实体,如图形 对象、块、图层、实体 等。 使用 Handle 可以方便地操作 CAD 实体,例如: 获取 CAD 实体的 Handle。 根据 Handle 获取 CAD 实体。 在上面的示例

    2023年04月20日
    浏览(46)
  • Datawhale 大模型基础理论 Day1 引言

    开源链接如下:https://github.com/datawhalechina/so-large-lm/blob/main/docs/content/ch01.md 语言模型的概念:即能够赋予每个有意义的词(token)以一定的概率的一个函数的集合。 语言模型可以被用来评估输入的质量,也可以根据prompt生成对应的内容(作画、描述、回答等) 温度,可以控制

    2024年01月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包