文章目录
- 一、引言
- 二、认识
- 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是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。
属性 | 类型 | 描述 |
---|---|---|
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循环 |
三、使用
以单个子线程为例:进度条
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