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

  • Android的消息机制主要是指Handler的运行机制,我们应该都清楚Handler的运行,需要底层的MessageQueue和Looper来支撑,通过Handler的post或者send来发送消息到MessageQueue消息队列中,二Looper会无线循环去查看是否有新消息,如果有就处理消息,如果没有就处于一直等待的状态,当然这是最简单明了的理解,一般我们使用Handler最多的就是用来刷新UI,因为子线程不能刷新UI啊,这也是Android规范限制,其实Handler并不局限于刷新UI,只是我们常常用它来刷新UI而已,今天我们来详细的了解一下关于Handler的消息机制。
    Android消息机制(Handler原理)_第1张图片

MessageQueue

  • 简称消息队列,但是它的底层的实现确是单链表形式,以单链表的数据结构维护消息列表,单链表在插入和删除上是比较有优势的。而MessageQueue的主要操作是插入和读取,而插入和读取这两个操作对应的方法是equeueMessage和next

  • 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方法来处理消息。

更多相关文章

  1. [置顶] 史上最全selector和shape使用方法 Android ListView 列表
  2. Android 获取内外置存储卡方法
  3. Android Junit 单元测试、异步测试方法简介及异步测试框架指南
  4. Android打包成jar文件方法总结
  5. 一篇文章带你了解 Android 消息机制的原理!
  6. android的应用程序调用另一个应用程序的方法

随机推荐

  1. cocos2d-x 通过JNI实现c/c++和Android的j
  2. 『叫兽学堂』带你抢先品尝“姑姑”所制作
  3. Android AIDL-跨进程
  4. Android Studio启动时卡在Fetching Andro
  5. js判断是否在微信浏览器中打开
  6. android:paddingBottom=“@dimen/activity
  7. android工程中的R.java文件
  8. 谈谈Android中的Rect类——奇葩的思维
  9. Android Framework中的Application Frame
  10. android中重写onConfigurationChanged方