返回
Handler基本操作及源码分析
Android
2023-10-21 03:53:21
Handler是一种用于处理消息的工具,它可以将一些耗时操作放在子线程中执行,然后通过Handler将执行结果传递回主线程。Handler由两个主要组件组成:消息队列和消息循环。消息队列用于存储待处理的消息,而消息循环则不断地从消息队列中取出消息并执行。
Handler的用法
- 创建Handler对象:
Handler handler = new Handler();
- 向Handler发送消息:
handler.sendMessage(new Message());
- 处理消息:
@Override
public void handleMessage(Message msg) {
// 处理消息
}
Handler的源码分析
Handler的源码位于android.os.Handler
类中,该类继承自HandlerThread
,后者是一个专门用于处理消息的线程类。Handler的构造函数如下:
public Handler() {
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = null;
}
从构造函数中可以看出,Handler需要一个Looper对象,这个Looper对象可以是当前线程的Looper,也可以是其他线程的Looper。如果当前线程没有Looper,则需要先调用Looper.prepare()
方法来创建一个Looper。
Handler的sendMessage()
方法如下:
public final boolean sendMessage(Message msg) {
if (msg == null) {
throw new NullPointerException("msg cannot be null");
}
// ...
return sendMessageAtTime(msg, SystemClock.uptimeMillis());
}
该方法首先对消息对象进行了一些检查,然后将消息对象加入到消息队列中。
Handler的handleMessage()
方法如下:
public void handleMessage(Message msg) {
if (mCallback != null) {
mCallback.handleMessage(msg);
}
}
该方法从消息队列中取出消息对象,然后调用handleMessage()
方法来处理消息。
Handler的使用技巧
- 避免在主线程中执行耗时操作,以免导致ANR。
- 使用Handler来将耗时操作放在子线程中执行,然后通过Handler将执行结果传递回主线程。
- 不要在Handler的
handleMessage()
方法中执行耗时操作,以免导致消息队列被阻塞。 - 如果需要在Handler的
handleMessage()
方法中执行耗时操作,可以使用AsyncTask
或IntentService
来执行耗时操作。 - 使用Handler来实现UI更新,以免导致UI线程被阻塞。