美文网首页
Android的消息机制

Android的消息机制

作者: dd85bd3cabef | 来源:发表于2017-07-12 16:16 被阅读3次

    概述#

    MessageQueue##

    MessageQueue并不是一个队列对象,而是通过一个单链表的数据结构来维护消息列表。
    对于一个单链表,插入方法和取出方法是主要的方法类型。

    • 插入方法——enqueueMessage:
      就是一个典型的单链表插入操作
    • 取方法——next
      是一个无限循环的方法,如果没有消息,那么就会一直阻塞。当有新消息来的时候,就会把这个方法取出并在单链表当中删除。

    Looper##

    Handler需要一个Looper才能工作。通过Looper.Prepare()方法进行Looper的创建。另外还有一个Looper.prepareMainLooper是用来创建主线程当中的Looper的。另外有一个getMainLooper()方法让我们可以在任何地方取得主线程的Looper。
    Looper提供了quit和quitSafety两个方法来退出Looper。退出Looper后,Handler就不能工作了。我们需要进行退出,放置Looper一直阻塞在那边。

    Loop方法###

    对于一个Looper来说,最重要的是loop方法,这也是一个死循环,如果MessageQueue传过来的message是null,才会退出。quitSafety就是Queue最后添加一个退出标记,让当前消息处理完后,Looper退出。
    如果MessageQueue返回了新消息,调用msg.target(发送这个消息的handler对象)的dispatchMessage()方法来分发消息。这样就可以成功地到指定线程当中去执行任务了。

    Handler##

    Handler主要通过post和send的一系列方法来进行消息的方法。其中post最终调用的还是send方法。send方法最终只是向消息队列插入了一条消息。之后就会调用消息队列的next的方法,交给looper。而looper接收到这个消息后开始处理,最后消息传给Handler,调用dispatchmessage方法,分发消息。

    dispatchMessage###

    分发消息的过程主要看Message对象是否有回调callback-----一个Runnable对象,实际上也是post方法当中所传递的Runnable对象。如果有,交给他执行。如果没有,那么需要调用handler的handleMessage方法来对消息处理。

    创建Handler对象法##

    一般来说,我们创建handler对象,需要派生一个handler的子类,重写handMessage方法并且实例化。
    不过,通过callback,我们可以不派生子类就可以创建handler对象,典型的就是让我们的类实现callback接口就可以了。
    Android消息处理的流程如下:


    screenshot.png

    主线程的消息循环##

    android的主线程ActivityThread,入口方法是main。main当中调用了Looper.prepareMainLooer()来创建主线程的Looper以及消息队列。同时,需要一个handler来传递。这个就是大名鼎鼎的H对象,一个handler。

    相关文章

      网友评论

          本文标题:Android的消息机制

          本文链接:https://www.haomeiwen.com/subject/ckfbhxtx.html