Android 線程之自定義帶消息循環(huán)Looper的實例
Android 線程之自定義帶消息循環(huán)Looper的實例
Android系統的UI線程是一種帶消息循環(huán)(Looper)機制的線程,同時Android也提供了封裝有消息循環(huán)(Looper)的HandlerThread類,這種線程,可以綁定Handler()對象,并通過Handler的sendMessage()函數向線程發(fā)送消息,通過handleMessage()函數,處理線程接收到的消息。這么說比較抽象,那么,本文就利用基礎的Java類庫,實現一個帶消息循環(huán)(Looper)的線程,以幫助初學者理解這樣一個Looper到底是怎么工作的。
1. 首先,我們完成一個簡單的線程框架。
public class LooperThread {
private volatile boolean mIsLooperQuit = false;
private Thread mThread;
public void start() {
if( mThread != null ) {
return;
}
mIsLooperQuit = false;
mThread = new Thread(mLooperRunnable);
mThread.start();
}
public void stop() {
if( mThread == null ) {
return;
}
mIsLooperQuit = true;
mThread = null;
}
protected Runnable mLooperRunnable = new Runnable() {
@Override
public void run() {
while( !mIsLooperQuit ) {
}
}
};
}
如上述代碼所示,mLooperRunnable.run()循環(huán)執(zhí)行線程任務,mIsLooperQuit則是線程退出循環(huán)的條件。下面,我們將添加消息的發(fā)送和處理代碼。
2. 添加線程循環(huán)的消息發(fā)送和處理代碼
(1) 定義消息結構體,創(chuàng)建消息隊列
public class LooperThread {
private Queue<Message> mMessageQueue = new LinkedList<Message>();
public static class Message {
int what;
}
}
(2) 創(chuàng)建互斥鎖和條件變量
public class LooperThread {
private Lock mLock = new ReentrantLock();
private Condition mCondition = mLock.newCondition();
}
(3) 創(chuàng)建發(fā)送消息的函數
//發(fā)送消息,由外部其他模塊調用,發(fā)送消息給線程
public void sendMessage( Message message ) {
if( mThread == null ) {
return;
}
mLock.lock();
mMessageQueue.add(message); //添加消息到消息隊列
mCondition.signal(); //通知線程循環(huán),有消息來了,請立即處理
mLock.unlock();
}
(4) 創(chuàng)建處理消息的函數
//處理消息,由線程內部調用
public void handleMessage(Message message) {
//這里可以通過一個Callback來回調監(jiān)聽者
}
(5) 在mLooperRunnable.run()循環(huán)中解析消息
protected Runnable mLooperRunnable = new Runnable() {
@Override
public void run() {
while( !mIsLooperQuit ) {
mLock.lock();
Message message = null;
try {
while( !mIsLooperQuit && mMessageQueue.isEmpty() ) {
mCondition.await(); //沒有消息到來則休眠
}
message = mMessageQueue.poll();
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
mLock.unlock();
}
handleMessage(message );
}
};
}
(6) 修改線程的Stop()函數,喚醒休眠的消息循環(huán)
public void stop() {
if( mThread == null ) {
return;
}
mIsLooperQuit = true;
mLock.lock();
mCondition.signal();
mLock.unlock();
mMessageQueue.clear();
mThread = null;
}
到這里,一個基本的帶有消息循環(huán)的線程類封裝就完成了,相信大家應該從編寫這段代碼的過程中,理解了系統是如何實現消息循環(huán)的。
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
如何利用Android Studio將moudle變成jar示例詳解
這篇文章主要給大家介紹了關于如何利用Android Studio將moudle變成jar的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來跟著小編一起學習學習吧。2017-08-08
Android?RecyclerLineChart實現圖表繪制教程
這篇文章主要為大家介紹了Android?RecyclerLineChart實現圖表繪制教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12

