HandlerThread、Loop、MessageQueue、Handler、MessageからなるAndroidのメッセージ処理メカニズム

2200 ワード

                       UI     ,    UI      .
 
 
 
 

1.HandlerThread: 。

 

public class HandlerThread extends Thread {
    private int mPriority;
    private int mTid = -1;
    private Looper mLooper;

2.Message:メッセージ・オブジェクト.
3.MessageQueue:Messageの を し、 な である.
4.Handler:Messageの およびMessageの を し、デフォルトのコンストラクタで されたオブジェクトはUIスレッドのLoopオブジェクトをバインドし、Handler(Loop lp)コンストラクタで されたオブジェクトはlpオブジェクトをバインドします.
5.Loop:MessageQueueオブジェクトを し、それを し、Handlerオブジェクト(そのLoopオブジェクトにバインドされたHandler)から られてきたMessageオブジェクトをMessageQueueオブジェクトに します.
と、Message Queueオブジェクトの のMessageオブジェクトをHandlerオブジェクト(このLoopオブジェクトにバインドされたHandler)に して する.
: スレッドにはLoopが1つしかありません.HandlerがLoopオブジェクトをバインドすると、HandlerはそのLoopオブジェクトを つスレッドをバインドします.
Loopオブジェクトは、HandlerThreadオブジェクトのgetLooper()メソッドで できます.
:Loopの のソースコード
public class Looper {
    

    final MessageQueue mQueue;
    volatile boolean mRun;
    Thread mThread;

UI のスレッドでメッセージを する :
/**
 *   UI          
 * @author wuzm
 *
 */
public class Test {
	
	private class ThreadHandler extends Handler{
		
		public ThreadHandler(Looper looper){
			super(looper);
		}

		@Override
		public void handleMessage(Message msg) {
			if(msg.what == 1){
				/*         */
			}
			super.handleMessage(msg);
		}
		
	}
	
	public Test(){
		HandlerThread handlerThread = new HandlerThread("TestHandlerThread");
		Looper looper = handlerThread.getLooper();
		ThreadHandler handler = new ThreadHandler(looper);
		Message msg = new Message();
		msg.what = 1;
		handler.sendMessage(msg);
	}
	
}

UIスレッドでメッセージを する :
/**
 *  UI          
 * @author wuzm
 *
 */
public class Test {
	
	private Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			if(msg.what == 1){
				/*       */
			}
			super.handleMessage(msg);
		}
		
	};
	
	public Test(){
		Message msg = new Message();
		msg.what = 1;
		handler.sendMessage(msg);
	}
	
}