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

一、引言

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

二、认识

1、为什么要用Handle

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

2、原理图

基础原理图

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循环

三、使用

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

进度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

猜你喜欢

转载自blog.csdn.net/weixin_48916759/article/details/131180739