Handler 机制简单解释

Handler 主要用于线程间通信

四个要素

以下解释摘抄自<<第一行代码>>:

  • Message:
    Message 是在线程之间传递的消息,它可以在内部携带少量的信息, 用于在不同线程间传递数据. Message 的what,arg1和arg2 字段用来携带整型数据, obj 字段用来携带一个 Object 对象.
  • Handler:
    Handler 顾名思义就是处理者的意思, 它主要是用于发送和处理消息. 发送消息一般是使用 Handler 的 sendMessage() 方法,post() 方法等, 而发出的消息经过一系列的辗转处理后, 最终会传递到 Handler 的 handlerMessage() 方法中.
  • MessageQueue
    MessageQueue 是消息队列的意思, 它主要用于存放所有通过 Handler 发送的消息. 这部分消息会一直存在于消息队列中, 等待被处理. 每个线程中只会有一个 MessageQueue 对象.
  • Looper:
    Looper 是每个线程中的MessageQueue 的管家,调用 Looper 的 loop() 方法后, 就会进入一个无限循环当中, 然后每当发现 MessageQueue 中存在一条消息时,就会将它取出, 并传递到 Handler 的 handleMessage() 方法中. 每个线程中只会有一个 Looper 对象.

源码简单解释

创建handler对象前,须确保handler所在的线程已调用过Looper.prepare()
Looper.prepare()、new Handler()、Loop.loop()的调用须在同一个线程

  1. A线程:Looper.prepare(); 该方法执行以下操作:

    • new Looper(); Looper构造函数会执行以下操作:

      创建消息队列 mQueue = new MessageQueue()
      持有当前线程 mThread = Thread.currentThread();

    • 通过 sThreadLocal.set(new Looper()) 与当前线程绑定
      为保证 looper 对象唯一,每个线程只能prepare一次
  2. A线程:handler = new Handler();Handler会执行以下操作:

    通过Looper.myLooper() 持有 looper 对象
    通过looper.mQueue 持有 MessageQueue 对象

  3. A线程:Loop.loop(); loop方法会执行以下操作:

    • 通过 myLooper() 得到 looper 对象
    • 通过 looper.mQueue 得到 MessageQueue 对象 queue
    • 创建for(;;)死循环:

      通过queue.next() 得到 Message 对象 msg
      通过msg.target.dispatchMessage(msg) 最终调用 handler.handleMessage(msg) 方法
      另外,通过 looper.quit() 可以结束这个死循环

  4. B线程:handler.sendMessage(message); 该方法执行以下操作:

    1. message 通过 message.target = this 持有handler
    2. 通过 enqueueMessage(queue, message, uptimeMillis) 将message添加到 MessageQueue 消息队列中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章