Handler的进一步了解

2021/04/07 14:58:01

Handler的定义?

Handler是Android SDK来处理异步消息的核心类。
子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。

Handler机制中涉及到的类以及各自的功能是什么?

(1)Handler:将 Message 对象发送到 MessageQueue 中去,同时将自己的引用赋值给 Message#target
(2)Looper:将 Message 对象从 MessageQueue 中取出来,并将其交给 Handler#dispatchMessage(Message) 方法,这里需要主要的是:不是调用 Handler#handleMessage(Message) 方法
(3)MessageQueue:负责插入和取出 Message
(4)Message
( 其他:ThreadLocal 可以不算在里面毕竟这个是JDK本身自带类不是专门为Handler机制设计的。)

Handler 发送消息的方法
sendMessage(Message msg)
sendMessageDelayed(Message msg, long uptimeMillis)
post(Runnable r)
postDelayed(Runnable r, long uptimeMillis)
sendMessageAtTime(Message msg,long when)
//不常用
sendEmptyMessage(int what)
sendEmptyMessageDelayed(int what, long uptimeMillis)
sendEmptyMessageAtTime(int what, long when)
Message#when 是指的是什么

Message#when 是一个时间,用于表示 Message 期望被分发的时间,该值是 SystemClock#uptimeMillis() 与 delayMillis 之和。

// 
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
   
    if (delayMillis < 0) {
   
        delayMillis = 0;
    }
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}

SystemClock#uptimeMillis() 是一个表示当前时间的一个相对时间,它代表的是 自系统启动开始从0开始的到调用该方法时相差的毫秒数 。

子线程中可以创建 Handler 对象吗?

答案当然是不可以在子线程中直接调用 Handler 的无参构造方法,因为 Handler 在创建时必须要绑定一个 Looper 对象,有两种方法绑定

(1)先调用 Looper.prepare() 在当前线程初始化一个 Looper,例如:
Handler handler = new Handler();
// ....
// 必不可少的一步
Looper.loop();
(2)

通过构造方法传入一个 Looper

Looper looper = .....;
Handler handler = new Handler(looper);
Handler 有哪些构造方法

共有4种,分别是无参、单Looper、单Callback、Looper和Handler。

public Handler() {
   
    this(null, false);
}
public Handler(Callback callback) {
   
    this(callback, false);
}
public Handler(Looper looper) {
   
    this(looper, null, false);
}
public Handler(Looper looper, Callback callback) {
   
    this(looper, callback, false);
}