編輯:關於Android編程
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用戶精心優化的免費視頻應用,集視頻搜索、視頻推薦、離線觀看、劇集提醒等等眾多創新優秀功能於一身。它不僅僅是
一個關於自定義控件的小Demo,隨著手指移動的小球。先看下效果圖:實現代碼如下:1.自定義控件類package com.dc.customview.view;import
前面的博文對Lichee做了系列分析,其實就是對在《七年之癢》中所說的,Android BSP具備的一項基本素質-SHELL腳本,所以我們Lichee系列的文章著重分析了
本文實例講述了Android編程之控件ListView使用方法。分享給大家供大家參考。具體分析如下:控件ListView是一個重要的控件,可以被用作用戶列表等顯示,下面進