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);
}
}