Looper、Handler、Message

Looper

  • 用于在线程上运行消息循环的循环者
  • Threads默认没有消息循环,线程通过调用Looper.prepare(),创建Looper, 然后通过调用Looper.loop()方法处理消息,直到Looper停止。

下面就是将一个普通线程变成循环线程。即循环工作的线程,mHandler发来消息,就处理。

private class LooperThread extends Thread {
    public Handler mHandler;

    public void run() {
        Looper.prepare();

        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                Log.d("LooperThread", "handleMessage " + msg.toString());
            }
        };

        Looper.loop();
    }
}

查看源码可知,Looper有自己的MessageQueue,调用loop()后,会执行for循环,从消息队列中取出消息执行。

一个线程只能有一个Looper对象,即ThreadLocal。

Handler

  • Handler用于发送和处理Message,并且与线程的消息队列关联。
  • 每个Handler实例与一个单独的线程相关联,当你创建一个Handler,这个Handler就被绑定到创建它的线程上,即handleMessage处理消息的线程。
  • 当消息队列处理消息的时候,Handler用于传递消息。

Handler两大使用场景

  1. 调度消息在未来的某个时间执行。
  2. 执行一个动作在不同的线程。

Message

  • 用于Handler发送数据的载体。
  • 尽管Message的构造方法是public的,但是最好还是调用Message.obtain() or Handler.obtainMessage(),会优先从Message Pool中找,找不到再创建一个新的Message。

你可能感兴趣的:(Looper、Handler、Message)