Android中Looper的quit方法和quitSafely方法
来源:互联网 发布:香港买西服 知乎 编辑:程序博客网 时间:2024/06/08 14:23
Looper是通过调用loop方法驱动着消息循环的进行: 从MessageQueue中阻塞式地取出一个消息,然后让Handler处理该消息,周而复始,loop方法是个死循环方法。
那如何终止消息循环呢?我们可以调用Looper的quit方法或quitSafely方法,二者稍有不同。
Looper的quit方法源码如下:
public void quit() { mQueue.quit(false);}
Looper的quitSafely方法源码如下:
public void quitSafely() { mQueue.quit(true);}
以上两个方法中mQueue是MessageQueue类型的对象,二者都调用了MessageQueue中的quit方法,MessageQueue的quit方法源码如下:
void quit(boolean safe) { if (!mQuitAllowed) { throw new IllegalStateException("Main thread not allowed to quit."); } synchronized (this) { if (mQuitting) { return; } mQuitting = true; if (safe) { removeAllFutureMessagesLocked(); } else { removeAllMessagesLocked(); } // We can assume mPtr != 0 because mQuitting was previously false. nativeWake(mPtr); }}
通过观察以上源码我们可以发现:
当我们调用Looper的quit方法时,实际上执行了MessageQueue中的removeAllMessagesLocked方法,该方法的作用是把MessageQueue消息池中所有的消息全部清空,无论是延迟消息(延迟消息是指通过sendMessageDelayed或通过postDelayed等方法发送的需要延迟执行的消息)还是非延迟消息。
当我们调用Looper的quitSafely方法时,实际上执行了MessageQueue中的removeAllFutureMessagesLocked方法,通过名字就可以看出,该方法只会清空MessageQueue消息池中所有的延迟消息,并将消息池中所有的非延迟消息派发出去让Handler去处理,quitSafely相比于quit方法安全之处在于清空消息之前会派发所有的非延迟消息。
无论是调用了quit方法还是quitSafely方法只会,Looper就不再接收新的消息。即在调用了Looper的quit或quitSafely方法之后,消息循环就终结了,这时候再通过Handler调用sendMessage或post等方法发送消息时均返回false,表示消息没有成功放入消息队列MessageQueue中,因为消息队列已经退出了。
需要注意的是Looper的quit方法从API Level 1就存在了,但是Looper的quitSafely方法从API Level 18才添加进来。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android中Looper的quit方法和quitSafely
- Android中Looper的quit方法和quitSafely方法
- Android中Looper的quit方法和quitSafely方法
- Android中Looper的quit方法和quitSafely方法
- Android中Looper的quit方法和quitSafely方法
- Android中Looper的quit方法和quitSafely方法
- Looper.quit方法
- selenium中的quit和close方法的区别
- Looper的方法详解
- Android关于looper的几个方法的个人理解
- Java+Selenium3方法篇20-浏览器退出quit和close的区别
- android中handler和looper的工作原理
- Looper.preare() ,quit()
- android中requestLayout方法和invalidate()方法的区别
- Android中为什么主线程不会因为Looper.loop()方法造成阻塞
- Android中为什么主线程不会因为Looper.loop()方法造成阻塞
- Android中为什么主线程不会因为Looper.loop()方法造成阻塞
- 为什么Handler在主线程中不需要使用Looper.prepare()和loop()方法?看源码!
- Looper.prepare()方法
- swift笔记2
- Github 常用代码
- Android平台,利用zxing库开发扫码功能
- Jenkins进阶系列之——09配置Linux系统ssh免密码登陆
- iOS开发Swift UITableView和UICollectionView的使用
- Android中Looper的quit方法和quitSafely方法
- Android练习项目 Mp3播放器实现(二)
- JavaScript中为什么null==0为false而null>=0为true
- code与html分离,PHP中模板的使用
- fastjson把对象转化成json避免$ref
- 如何使用testcenter统计开发工程师工作质量?
- centos安装redis3.0
- Swift笔记:继承
- mac下使用karabiner重定义键盘