handler傳送訊息之後做了什麼事情。

2021-10-06 01:13:43 字數 1607 閱讀 8708

首先來看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...