歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發實踐:自定義帶消息循環(Looper)的工作線程

Android開發實踐:自定義帶消息循環(Looper)的工作線程

日期:2017/3/1 9:36:37   编辑:Linux編程

上一篇文章提到了Android系統的UI線程是一種帶消息循環(Looper)機制的線程(http://www.linuxidc.com/Linux/2014-12/110161.htm),同時Android也提供了封裝有消息循環(Looper)的HandlerThread類,這種線程,可以綁定Handler()對象,並通過Handler的sendMessage()函數向線程發送消息,通過handleMessage()函數,處理線程接收到的消息。這麼說比較抽象,那麼,本文就利用基礎的Java類庫,實現一個帶消息循環(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()循環執行線程任務,mIsLooperQuit則是線程退出循環的條件。下面,我們將添加消息的發送和處理代碼。

2. 添加線程循環的消息發送和處理代碼

(1) 定義消息結構體,創建消息隊列

public class LooperThread {

private Queue<Message> mMessageQueue = new LinkedList<Message>();

public static class Message {

int what;

}

}

(2) 創建互斥鎖和條件變量

public class LooperThread {

private Lock mLock = new ReentrantLock();

private Condition mCondition = mLock.newCondition();

}

(3) 創建發送消息的函數

//發送消息,由外部其他模塊調用,發送消息給線程

public void sendMessage( Message message ) {

if( mThread == null ) {

return;

}

mLock.lock();

mMessageQueue.add(message); //添加消息到消息隊列

mCondition.signal(); //通知線程循環,有消息來了,請立即處理

mLock.unlock();

}

(4) 創建處理消息的函數

//處理消息,由線程內部調用

public void handleMessage(Message message) {

//這裡可以通過一個Callback來回調監聽者

}

(5) 在mLooperRunnable.run()循環中解析消息

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()函數,喚醒休眠的消息循環

public void stop() {

if( mThread == null ) {

return;

}

mIsLooperQuit = true;

mLock.lock();

mCondition.signal();

mLock.unlock();

mMessageQueue.clear();

mThread = null;

}

到這裡,一個基本的帶有消息循環的線程類封裝就完成了,相信大家應該從編寫這段代碼的過程中,理解了系統是如何實現消息循環的。完整的代碼見博文最後的附件,有任何疑問歡迎留言或者來信[email protected]交流。

相關附件下載地址

------------------------------------------分割線------------------------------------------

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2014年資料/12月/4日/Android開發實踐:自定義帶消息循環(Looper)的工作線程

下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

------------------------------------------分割線------------------------------------------

最簡單的Ubuntu Touch & Android 雙系統安裝方式 http://www.linuxidc.com/Linux/2014-01/94881.htm

在Nexus上實現Ubuntu和Android 4.4.2 雙啟動 http://www.linuxidc.com/Linux/2014-05/101849.htm

Ubuntu 14.04 配置 Android SDK 開發環境 http://www.linuxidc.com/Linux/2014-05/101039.htm

64位Ubuntu 11.10下Android開發環境的搭建(JDK+Eclipse+ADT+Android SDK詳細) http://www.linuxidc.com/Linux/2013-06/85303.htm

Ubuntu 14.04 x64配置Android 4.4 kitkat編譯環境的方法 http://www.linuxidc.com/Linux/2014-04/101148.htm

Ubuntu 12.10 x64 安裝 Android SDK http://www.linuxidc.com/Linux/2013-03/82005.htm

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved