Android開発実践:メッセージループ付きワークスレッドをカスタマイズ


前の記事では、AndroidシステムのUIスレッドは、メッセージループ(Looper)メカニズムを持つスレッドであるとともに、Androidは、Handler()オブジェクトをバインドし、HandlerのsendMessage()関数を介してスレッドにメッセージを送信する、handleMessage()関数を介して、メッセージループ(Looper)をカプセル化したHandlerThreadクラスを提供しています.スレッドが受信したメッセージを処理します.抽象的に言えば,本稿では基礎的な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 mMessageQueue = new LinkedList();
    
    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を歓迎します[email protected]交流したり、私の新浪微博@ルー_に注目したりします.俊は最新の文章と情報を取得した.