返回

Handler+Message源码分析之底层原理剖析

Android

Handler源码分析

Handler类位于android.os包中,是一个抽象类,它定义了处理消息的接口。Handler主要有以下几个成员变量:

  • Looper mLooper:Looper对象,负责管理消息队列和消息循环。
  • MessageQueue mQueue:消息队列,用于存储消息。
  • Callback mCallback:回调接口,用于处理消息。

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负责管理消息队列和消息循环,它是消息机制的基础。

Handler的handleMessage()方法用于处理消息。当消息从消息队列中取出后,就会调用handleMessage()方法来处理消息。handleMessage()方法的实现如下:

public void handleMessage(Message msg) {
    if (mCallback != null) {
        mCallback.handleMessage(msg);
    }
}

如果Handler设置了回调接口,那么消息就会被转发给回调接口的handleMessage()方法来处理。回调接口的handleMessage()方法可以根据消息的内容来执行相应的操作。

Message源码分析

Message类位于android.os包中,它封装了消息的内容。Message主要有以下几个成员变量:

  • what:消息的标识。
  • arg1:消息的第一个参数。
  • arg2:消息的第二个参数。
  • obj:消息的对象参数。

Message的构造函数如下:

public Message() {
    when = SystemClock.uptimeMillis();
}

Message的构造函数中,将当前时间戳作为消息的时间戳。

Message还提供了几个静态方法来创建消息对象,例如:

  • obtain():从消息池中获取一个消息对象。
  • obtain(Handler):从消息池中获取一个消息对象,并设置该消息对象的Handler。
  • obtain(Handler, int):从消息池中获取一个消息对象,并设置该消息对象的Handler和消息标识。

Handler和Message的使用示例

下面是一个使用Handler和Message实现跨线程通信的示例代码:

public class MainActivity extends Activity {

    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建Handler对象
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                // 处理消息
                switch (msg.what) {
                    case 1:
                        // 更新UI
                        TextView tv = findViewById(R.id.tv);
                        tv.setText("Hello World!");
                        break;
                }
            }
        };

        // 创建子线程
        new Thread() {
            @Override
            public void run() {
                // 发送消息
                Message msg = mHandler.obtainMessage();
                msg.what = 1;
                mHandler.sendMessage(msg);
            }
        }.start();
    }
}

在这个示例代码中,我们在主线程中创建了一个Handler对象,并在子线程中发送了一条消息给Handler。Handler收到消息后,会调用handleMessage()方法来处理消息。在handleMessage()方法中,我们更新了UI,将“Hello World!”显示在TextView上。

总结

Handler和Message是Android消息机制的核心,它们可以实现跨线程通信。Handler负责管理和分发消息,而Message则封装了消息的内容。通过使用Handler和Message,我们可以轻松地实现跨线程通信,从而使我们的程序更加高效。