返回

Handler基本操作及源码分析

Android

Handler是一种用于处理消息的工具,它可以将一些耗时操作放在子线程中执行,然后通过Handler将执行结果传递回主线程。Handler由两个主要组件组成:消息队列和消息循环。消息队列用于存储待处理的消息,而消息循环则不断地从消息队列中取出消息并执行。

Handler的用法

  1. 创建Handler对象:
Handler handler = new Handler();
  1. 向Handler发送消息:
handler.sendMessage(new Message());
  1. 处理消息:
@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的使用技巧

  1. 避免在主线程中执行耗时操作,以免导致ANR。
  2. 使用Handler来将耗时操作放在子线程中执行,然后通过Handler将执行结果传递回主线程。
  3. 不要在Handler的handleMessage()方法中执行耗时操作,以免导致消息队列被阻塞。
  4. 如果需要在Handler的handleMessage()方法中执行耗时操作,可以使用AsyncTaskIntentService来执行耗时操作。
  5. 使用Handler来实现UI更新,以免导致UI线程被阻塞。