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不斷從訊息從訊息佇列中取出訊息...