handler機制原理 看完就明白系列

2021-10-12 04:41:42 字數 2796 閱讀 6434

handler handler = new handler()

};message msg = handler.obtainmessage();

handler.sendmessage(msg);

1  第一步 建立handler 物件,new handler()

public class handler 

public handler(@nullable callback callback, boolean async)

mqueue = mlooper.mqueue;// 訊息佇列是在 初始化looper 物件的時候 建立的

mcallback = callback; // 此處callback 是 通過 new handler(callback),後面再說

masynchronous = async;

}public void dispatchmessage(@nonnull message msg) else

}handlemessage(msg); //空構造方法會直接呼叫}}

}

總結,handler 物件建立後,相應的looper,messagequeue也隨之建立完成

2 第二步 建立message = handler.obtainmessage()

public class handler 

}public final class message implements parcelable

public static message obtain()

}return new message();//訊息池 空,新建立訊息

}}

3 第三步 傳送訊息 handler.sendmessage(msg)

public class handler 

public final boolean sendmessagedelayed(@nonnull message msg, long delaymillis)

開機到當前的時間

return sendmessageattime(msg, systemclock.uptimemillis() + delaymillis);

}//最終呼叫的是這個方法

public boolean sendmessageattime(@nonnull message msg, long uptimemillis)

return enqueuemessage(queue, msg, uptimemillis);

}//插入訊息到訊息佇列當中

private boolean enqueuemessage(@nonnull messagequeue queue, @nonnull message msg,

long uptimemillis)

return queue.enqueuemessage(msg, uptimemillis);

}}public final class messagequeue

if (msg.isinuse())

synchronized (this)

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;

}}public final class looper

smainlooper = mylooper();}}

/**獲取主線程的looper 方法

**/ public static looper getmainlooper()

}/***初始化looper

**/ private static void prepare(boolean quitallowed)

sthreadlocal.set(new looper(quitallowed));

}public static void loop()

// make sure the observer won't change while processing a transaction.

final observer observer = sobserver;

try

dispatchend = needendtime ? systemclock.uptimemillis() : 0;

} catch (exception exception)

throw exception;

} finally

}msg.recycleunchecked(); /檢查**情況 將該訊息保留在**物件池中時將其標記為正在使用,清除所有其他詳細資訊}}

}

訊息入隊時 根據 訊息的when 排序插入到佇列中,如果當前的訊息還沒到時間,則 進入等待狀態,時間到了,或者有新的訊息進入,則喚醒 執行入隊或 執行訊息操作。

looper.loop 獲取訊息,

handler機制的原理

andriod提供了handler 和 looper 來滿足執行緒間的通訊。handler先進先出原則。looper類用來管理特定執行緒內物件之間的訊息交換 messageexchange 1 looper 乙個執行緒可以產生乙個looper物件,由它來管理此執行緒裡的messagequeue 訊息...

handler機制原理全面整理

1 handler用的最多是子執行緒傳送訊息到主線程修改ui 2 首先通過message中的obtain 從訊息池中獲取訊息物件 3 然後要建立handler物件,在handler的構造方法中就會得到輪詢器looper和訊息佇列,這個looper物件和訊息佇列是主線程建立的時候建立的,輪詢器就不斷的...

Handler機制原理及一些小坑 自己理解

handler機制 1.在主線程中,建立乙個handler物件 你在 建立的handler就在那裡接收 2.子執行緒通過handler傳送訊息message,呼叫sendmessage 方法將訊息傳送至messagerqueue訊息佇列中 3.然後主線程中的looper不斷從訊息從訊息佇列中取出訊息...