Android|Android消息机制(Handler原理)

学习笔记,如果哪里总结有问题,欢迎大家留言指正

  • Android的消息机制主要是指Handler的运行机制,我们应该都清楚Handler的运行,需要底层的MessageQueue和Looper来支撑,通过Handler的post或者send来发送消息到MessageQueue消息队列中,二Looper会无线循环去查看是否有新消息,如果有就处理消息,如果没有就处于一直等待的状态,当然这是最简单明了的理解,一般我们使用Handler最多的就是用来刷新UI,因为子线程不能刷新UI啊,这也是Android规范限制,其实Handler并不局限于刷新UI,只是我们常常用它来刷新UI而已,今天我们来详细的了解一下关于Handler的消息机制。
    Android|Android消息机制(Handler原理)
    文章图片
MessageQueue
  • 简称消息队列,但是它的底层的实现确是单链表形式,以单链表的数据结构维护消息列表,单链表在插入和删除上是比较有优势的。而MessageQueue的主要操作是插入和读取,而插入和读取这两个操作对应的方法是equeueMessage和next
  • 【Android|Android消息机制(Handler原理)】enqueueMessage主要进行的就是单链表的插入操作
  • next方法是一个无限循环的方法,如果消息队列中没有消息,那么next就会一直阻塞在这里,如果有新消息过来,next就会返回这条消息,并把它从单链表中移除出去,同时Looper中的loop方法也会一直监听next方法,知道next方法返回null,这个也是唯一一个让loop方法跳出循环的方式。
Looper的工作原理
  • 在我们使用Handler的时候,首先都需要Looper,而我们平常在使用Handler的时候却没有自己去创建Looper,而是直接new Handler()来发消息、切换线程,这是因为在ActivityThread(主线程)创建的时候已经为我们创建了一个Looper,所以我们不需要自己手动去创建Looper,而且我们可以通过getMainThread()这个方法拿到主线程的Looper,当然系统报错需要创建一个Looper,我们可以使用Looper.prepare()来创建一个Looper,然后通过Looper.loop()来开启循环,还有一个方法叫prepareMainLooper(),它是主要给ActivityThread创建Looper使用的,最终也是通过prepare方法来实现的。
  • 并且Looper也是可以退出的,Looper给我们提供了两个方法,一个是quite,一个是quiteSafely,第一个是直接就退出Looper了,第二个是设置一个标记,然后判断消息队列中是否还有消息,只有将消息处理完毕之后,才会安全退出,Looper退出完毕后,Handler发送的消息也会失败,这时候Handler的send方法会返回false。
  • 如果我们在子线程中创建了Looper,那么在使用完毕后,我们就需要手动调用quite方法来退出Looper,否则这个子线程就会一直处于等待状态,如果退出Looper,子线程也会立马终止。
Handler的工作原理
  • Handler发送消息可以通过post和send方法来发送消息,其实就是向消息队列中插入了一条消息,MessageQueue的next方法就会返回这条消息给Looper,Looper收到消息后就开始处理了,最终还是交给Handler的dispatchMessage来处理:
public void dispatchMessage(Message msg){ if(msg.callback != null){ handleCallback(msg); }else{ if(mCallback != null){ if(mCallback.handleMessage(msg){ return; } }handleMessage(msg); } }

  • 这里就是检查Messge的callback是否为空,不为空,调用handleCallback来处理消息,Message的callback就是一个Runnable对象,也就是我们post传递过来的那个Runnable对象,然后再判断mCallback是否为空,不为空就调用handleMessage方法,否则,最后就调用Handler的handleMessage方法来处理消息。

    推荐阅读