首先來看handler發訊息的幾個方式:
handler提供了好幾個傳送訊息的方式。
post系列和sendmessage系列都是差不多的最終都會呼叫sendmessageattime()函式:這裡用post系枚舉例
handler.post(runnable r) 入參是乙個runnable。
看看裡面做了什麼。
public final boolean post(runnable r)
裡面有乙個getpostmessage®;裡面做的事情就是拿到乙個message。我們來看看裡面的實現:它裡面通過message.obtain()(這個方法使用了享元模式這裡不細講)方法拿到乙個message物件。然後把我們傳進來的runnable新增到message中。
private static message getpostmessage(runnable r)
再看 sendmessagedelayed();裡面最終呼叫的是sendmessageattime()方法
public final boolean sendmessagedelayed(message msg, long delaymillis)
return sendmessageattime(msg, systemclock.uptimemillis() + delaymillis);
}這個方法就是判斷要入隊的佇列是否建立而已。
public boolean sendmessageattime(message msg, long uptimemillis)
return enqueuemessage(queue, msg, uptimemillis);
}
這個方法有乙個msg.target= this。這裡要注意一下。這個target是message裡面的乙個屬性,是乙個handler。之後處理訊息的可以表示是哪個handler發出來的訊息。
private boolean enqueuemessage(messagequeue queue, message msg, long uptimemillis)
return queue.enqueuemessage(msg, uptimemillis);
}這個是我們發出的message真正入隊的方法。佇列是乙個message的鍊錶結構的。根據時間排序來插入訊息的。
boolean enqueuemessage(message msg, long when)
msg.markinuse();
msg.when = when;
message p = mmessages;
boolean needwake;
if (p == null || when == 0 || when < p.when) else
if (needwake && p.isasynchronous())
}msg.next = p; // invariant: p == prev.next
prev.next = msg;
}// we can assume mptr != 0 because mquitting is false.
if (needwake)
}return true;
}
Handler傳送訊息
obtainmessage 得到乙個message物件。建立乙個message然後傳送是這麼寫的 message msg new message msg.arg1 1 msg.arg2 2 msg.what 3 msg.obj object handler.sendmessage msg 效能優化後...
Handler傳送訊息小結
obtainmessage 得到乙個message物件。建立乙個message然後傳送是這麼寫的 message msg new message msg.arg1 1 msg.arg2 2 msg.what 3 msg.obj object handler.sendmessage msg 效能優化後...
Handler訊息機制
android的訊息機制主要是指handler的執行機制,也就是handler message messagequeue looper threadlocal之間的工作過程。handler 主要用於傳送和處理訊息。messagequeue 訊息佇列,主要用於存放所有通過handler傳送的messa...