Android Handler机制之循环消息队列的退出

本文详细解析了Android Handler机制中如何退出循环消息队列,包括quitSafely()和quit()方法,以及它们如何影响MessageQueue。通过分析代码,阐述了非安全退出和安全退出的区别,以及退出时仍然发送消息的处理方式。
摘要由CSDN通过智能技术生成
2824145-8bc6d10af2118f1b.jpeg
啦啦.jpeg

该文章属于Android Handler系列文章,如果想了解更多,请点击
《Android Handler机制之总目录》

前言

在上几篇文中我们介绍了整个消息的循环机制以及消息的回收。现在我们来看看整么退出循环消息队列。(到现在为止,整个Android Handler机制快要接近尾声了。不知道大家看了整个系列的文章,有没有对Handler机制有个深一点的了解。如果对你有所帮助,我也感到十分的开心与自豪~~~)。

消息队列的退出

要想结束循环消息队列,需要调用Loooper的quitSafely()或quit()方法,具体代码如下所示:

public void quitSafely() { mQueue.quit(true);}
public void quit() { mQueue.quit(false); }

而该两个方法的内部,都会调用Loooper中对应的MessageQueue的quit(boolean safe)方法。查看quit(boolean safe)方法:

   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();
            }
            nativeWake(mPtr);
        }
    }

在MessageQueue的quit(boolean safe)方法中,会将mQuitting (用于判断当前消息队列是否已经退出,该标志位十分有用,下文会提到)置为true,同时会根据当前是否安全退出的标志 (safe)来走不同的逻辑,如果安全则走removeAllFutureMessagesLocked()方法,如果不是安全退出则走removeAllMessagesLocked()方法。下面分别对这两个方法进行讨论。

非安全退出 removeAllMessagesLocked()方法
    pr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值