91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-06-15 23:13:54 來源:網絡 閱讀:3423 作者:Jhuster 欄目:移動開發

上一篇文章提到了Android系統的UI線程是一種帶消息循環(Looper)機制的線程,同時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;		
}


到這里,一個基本的帶有消息循環的線程類封裝就完成了,相信大家應該從編寫這段代碼的過程中,理解了系統是如何實現消息循環的。完整的代碼見博文最后的附件,有任何疑問歡迎留言或者來信lujun.hust@gmail.com交流,或者關注我的新浪微博 @盧_俊 獲取最新的文章和資訊。


附件:http://down.51cto.com/data/2364962
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊吾县| 石狮市| 姜堰市| 乌兰察布市| 宝应县| 独山县| 新余市| 晋江市| 米林县| 胶州市| 洛浦县| 濮阳市| 肇东市| 罗甸县| 车致| 苏尼特左旗| 遵义县| 肃南| 江永县| 金塔县| 罗城| 中超| 手机| 武功县| 修文县| 壤塘县| 黑水县| 石河子市| 洮南市| 望谟县| 驻马店市| 靖宇县| 绥德县| 白河县| 察隅县| 金山区| 吴旗县| 丹阳市| 张掖市| 安图县| 丽水市|