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

一、引言

  • 描述:一个静态的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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端new守夜人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值