Handlerメッセージ処理メカニズムシリーズの「01.Handlerメッセージ送信」を必ず理解する
4099 ワード
Handlerメッセージ処理メカニズムシリーズの「Handlerメッセージ送信」を必ず理解する
Handlerメッセージの送信方法は2つあります. Post Send
シリーズディレクトリ:
Handlerメッセージ処理メカニズムシリーズの「01.Handlerメッセージ送信」を必ず理解する
Handlerメッセージ処理メカニズムシリーズの「02.Message入列」を必ず理解する
Handlerメッセージ処理メカニズムシリーズの「03.MessageQueueとLooperの由来」を必ず理解する
Handlerメッセージ処理メカニズムシリーズの「04.Messageがどのようにトリガーされたのか」を理解するに違いない.
Handlerメッセージの送信方法は2つあります.
public final boolean post(Runnable r){
return sendMessageDelayed(getPostMessage(r), 0);
}
/**
@param delayMillis
*/
public final boolean postDelayed(Runnable r, long delayMillis){
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
/**
Message , , ,
*/
public final boolean postAtFrontOfQueue(Runnable r){
return sendMessageAtFrontOfQueue(getPostMessage(r));
}
/**
@param uptimeMillis uptimeMillis
*/
public final boolean postAtTime(Runnable r, long uptimeMillis){
return sendMessageAtTime(getPostMessage(r), uptimeMillis);
}
public final boolean postAtTime(Runnable r, Object token, long uptimeMillis){
return sendMessageAtTime(getPostMessage(r, token), uptimeMillis);
}
各Postメソッドには共通のパラメータがあり、これはRunnableインタフェースが受信され、このパラメータはコールバックのために使用されることを示す.Postを使用してメッセージを送信するたびにsendMessageの関連メソッドが呼び出され、各sendMessageの関連メソッドにはMessageオブジェクトが必要になるので、Runnableオブジェクトを持ってgetPostMessageメソッドを呼び出し、private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
};
private static Message getPostMessage(Runnable r, Object token) {
Message m = Message.obtain();
m.obj = token;
m.callback = r;
return m;
};
getPostMessageはMessageオブジェクトを返し、Messageオブジェクトを持って関連sendMessageメソッドを呼び出します.public final boolean sendMessage(Message msg){
return sendMessageDelayed(msg, 0);
};
public final boolean sendEmptyMessage(int what){
return sendEmptyMessageDelayed(what, 0);
};
/**
@param uptimeMillis uptimeMillis
*/
public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) {
Message msg = Message.obtain();
msg.what = what;
return sendMessageAtTime(msg, uptimeMillis);
};
/**
@param delayMillis
*/
public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {
Message msg = Message.obtain();
msg.what = what;
return sendMessageDelayed(msg, delayMillis);
};
public final boolean sendMessageDelayed(Message msg, long delayMillis){
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
};
public final boolean sendMessageAtFrontOfQueue(Message msg) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, 0);
};
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
};
は、sendMessageAtFrontOfQueueメソッドを除いて、他のメソッドが最終的にsendMessageAtTimeメソッドを呼び出すMessageオブジェクトを生成し、sendMessageAtTimeで現在のメッセージキューを取得し、enqueueMessageメソッドが新しく生成したMessageオブジェクトをキューに入れることを見ることができる.private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
シリーズディレクトリ:
Handlerメッセージ処理メカニズムシリーズの「01.Handlerメッセージ送信」を必ず理解する
Handlerメッセージ処理メカニズムシリーズの「02.Message入列」を必ず理解する
Handlerメッセージ処理メカニズムシリーズの「03.MessageQueueとLooperの由来」を必ず理解する
Handlerメッセージ処理メカニズムシリーズの「04.Messageがどのようにトリガーされたのか」を理解するに違いない.