¡¡¡¡×÷Óãº
¡¡¡¡¹ØÁªÆðThread
¡¡¡¡Ñ»·È¡³öÏûÏ¢
¡¡¡¡1¡¢LooperÊÇ·ñ¿ÉÒÔÖ±½ÓʵÀý»¯?
¡¡¡¡Looper¹¹Ôì·½·¨ÊÇ˽Óеģ¬ÆäÖÐ×öÁËÁ½¼þÊÂ
¡¡¡¡´´½¨Ò»¸öMessageQueue
¡¡¡¡µÃµ½ÓëÖ®¶ÔÓ¦µÄThread
¡¡¡¡private Looper(boolean quitAllowed) {
¡¡¡¡mQueue = new MessageQueue(quitAllowed);
¡¡¡¡mThread = Thread.currentThread();
¡¡¡¡}
¡¡¡¡2¡¢Ò»¸öÏß³ÌÄܶÔÓ¦¶à¸öLopper?
¡¡¡¡²»ÄÜ£¬Ò»¸öÏ̶߳ÔÓ¦Ò»¸öLooper¶ÔÏó£¬Í¨¹ýThreadLocal±£Ö¤Ò»¸öÏß³ÌÖ»ÓÐÒ»¸öLooperÓëÖ®¶ÔÓ¦£¬Èç¹û¶à´Îµ÷ÓÃLooper.prepare();Ôò»áÅ׳öÔËÐÐʱÒì³£¡£
¡¡¡¡private static void prepare(boolean quitAllowed) {
¡¡¡¡if (sThreadLocal.get() != null) { // ²é¿´ÊÇ·ñÓÐlooperÓ뵱ǰÏ̶߳ÔÓ¦
¡¡¡¡throw new RuntimeException("Only one Looper may be created per thread");
¡¡¡¡}
¡¡¡¡sThreadLocal.set(new Looper(quitAllowed));
¡¡¡¡}
¡¡¡¡3¡¢LooperÊÇÎÞÏÞÑ»·£¬»á×èÈûÂð?
¡¡¡¡ÊÇ£¬µ±¿ªÆôÒ»¸öloopºóÊÇÒ»¸öËÀÑ»·£¬´ÓMessageQueueÖÐÈ¡³öÏûÏ¢£¬´¦ÀíÏûÏ¢£¬µ«ÊÇÒ²ÓпÉÄÜÍ˳ö£¬ÔÚûÓÐÏûÏ¢ºóÍ˳öÑ»·¡£
¡¡¡¡public static void loop() {
¡¡¡¡final Looper me = myLooper();
¡¡¡¡if (me == null) {
¡¡¡¡throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
¡¡¡¡}
¡¡¡¡final MessageQueue queue = me.mQueue;
¡¡¡¡// ÂÔ
¡¡¡¡for (;;) {
¡¡¡¡Message msg = queue.next(); // might block
¡¡¡¡if (msg == null) { // µ±Ã»ÓÐÏûÏ¢µÄʱºò£¬Í˳ö
¡¡¡¡// No message indicates that the message queue is quitting.
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡// ÂÔ
¡¡¡¡msg.target.dispatchMessage(msg);
¡¡¡¡}
¡¡¡¡4¡¢¿ÉÒÔÔٴε÷ÓÃLooper.prepareMainLooperÂð?
¡¡¡¡²»¿ÉÒÔ£¬Looper.prepareMainLooper×îÖÕÒ²Êǵ÷ÓÃprepare()£¬Í¬2.
¡¡¡¡public static void prepareMainLooper() {
¡¡¡¡prepare(false); // ´´½¨Ò»¸öLooper
¡¡¡¡synchronized (Looper.class) {
¡¡¡¡if (sMainLooper != null) {
¡¡¡¡throw new IllegalStateException("The main Looper has already been prepared.");
¡¡¡¡}
¡¡¡¡sMainLooper = myLooper();
¡¡¡¡}
¡¡¡¡}
¡¡¡¡5¡¢MainLooperʲôʱºò´´½¨µÄ?
¡¡¡¡MainLooperÊÇÆô¶¯Activity´´½¨ActivityThread(²¢²»ÊÇÒ»¸öThread)ʱºò´´½¨£¬ËùÒÔ²»Äܶà´Î´´½¨¡£
¡¡¡¡public static void main(String[] args) {
¡¡¡¡// ÂÔ
¡¡¡¡Process.setArgV0("
¡¡¡¡Looper.prepareMainLooper();
¡¡¡¡// ÂÔ
¡¡¡¡ActivityThread thread = new ActivityThread();
¡¡¡¡thread.attach(false);
¡¡¡¡// ÂÔ
¡¡¡¡if (sMainThreadHandler == null) {
¡¡¡¡sMainThreadHandler = thread.getHandler();
¡¡¡¡}
¡¡¡¡// ÂÔ
¡¡¡¡Looper.loop();
¡¡¡¡throw new RuntimeException("Main thread loop unexpectedly exited");
¡¡¡¡}
¡¡¡¡}
¡¡¡¡Handler
¡¡¡¡×÷ÓÃ:
¡¡¡¡·¢ËÍÏûÏ¢µ½MessageQueue
¡¡¡¡´¦ÀíÏûÏ¢
¡¡¡¡1¡¢HandlerÈçºÎÓëLooper¡¢MessageQueue¹ØÁªÆðÀ´?
¡¡¡¡ÎÒÃÇÖªµÀÒ»¸öLooper¶ÔÓ¦Ò»¸öThread£¬Ò»¸öLooper°üº¬Ò»¸öMessageQueue¡£µ±ÎÒÃÇ´´½¨Handlerʱ¾Í»á´Óµ±Ç°Ïß³ÌÖÐÈ¡³öÓëÖ®¶ÔÓ¦µÄLooper£¬ÈúóÔÚ´ÓLooperÖÐÈ¡³öMessageQueue¡£
¡¡¡¡// 1¡¢×Ô¶¯»ñÈ¡
¡¡¡¡public Handler(Callback callback, boolean async) {
¡¡¡¡// ÂÔ
¡¡¡¡mLooper = Looper.myLooper(); // È¡³öµ±Ç°Ïß³ÌÖеÄLooper
¡¡¡¡if (mLooper == null) {
¡¡¡¡throw new RuntimeException(
¡¡¡¡"Can't create handler inside thread that has not called Looper.prepare()");
¡¡¡¡}
¡¡¡¡mQueue = mLooper.mQueue; // È¡³öMessageQueue
¡¡¡¡mCallback = callback;
¡¡¡¡mAsynchronous = async;
¡¡¡¡}
¡¡¡¡// 2¡¢´«µÝÒ»¸öLooper½øÀ´
¡¡¡¡public Handler(Looper looper, Callback callback, boolean async) {
¡¡¡¡mLooper = looper;
¡¡¡¡mQueue = looper.mQueue;
¡¡¡¡mCallback = callback;
¡¡¡¡mAsynchronous = async;
¡¡¡¡}
¡¡¡¡Message
¡¡¡¡µ¥ÏîÁ´±í½á¹¹¡£
¡¡¡¡×÷Óãº
¡¡¡¡Êý¾ÝµÄÔØÌå
¡¡¡¡1¡¢ÏûÏ¢ÈçºÎ¸´ÓõÄ?
¡¡¡¡´ÓÈ«¾ÖÏûÏ¢³Ø(Á´±í½á¹¹)ÖÐ
¡¡¡¡public static Message obtain() {
¡¡¡¡synchronized (sPoolSync) {
¡¡¡¡if (sPool != null) {
¡¡¡¡Message m = sPool;
¡¡¡¡sPool = m.next;
¡¡¡¡m.next = null;
¡¡¡¡m.flags = 0; // clear in-use flag
¡¡¡¡sPoolSize--;
¡¡¡¡return m;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡return new Message();
¡¡¡¡}
¡¡¡¡2¡¢MessageΪʲôÄÜ´«µÝ?
¡¡¡¡AndroidÖÐÏëÒª´«µÝ¶ÔÏóҪôʵÏÖSerializableҪôParcelable£¬ÔÚÕâÀïÊÇʵÏÖÁËParcelable½Ó¿Ú¡£
¡¡¡¡public final class Message implements Parcelable {
¡¡¡¡// ÂÔ
¡¡¡¡}
¡¡¡¡3¡¢ÈçºÎÓëHandler¹ØÁª?
¡¡¡¡ÎÒÃÇÖªµÀÔÚÏûÏ¢´«»úÖÆÖÐHandler³äµ±×Å“¿ìµÝÔ±”µÄ½ÇÉ«£¬ÄÇôËûÓÖÊÇÈçºÎÓë“»õÎï”--Message·¢Éú¹ØϵÄØ?ʵ¼ÊÉÏMessageÓÐÒ»¸ö³ÉÔ±±äÁ¿targetËûµÄÀàÐÍÕýÊÇHandler£¬
¡¡¡¡/*package*/ Runnable callback;
¡¡¡¡public int arg1;
¡¡¡¡public int arg2;
¡¡¡¡public Object obj;
¡¡¡¡/*package*/ Handler target; // ¹Ø¼üµã
¡¡¡¡µ±ÎÒÃÇͨ¹ýHandlerÈ¥sendÒ»¸öMessageʱºò×îÖÕ¶¼»áΪtarget¸³ÖµÎªthis£¬¼´µ±Ç°µÄHandler¡£
¡¡¡¡private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
¡¡¡¡msg.target = this; // ¸³ÖµÓï¾ä
¡¡¡¡if (mAsynchronous) {
¡¡¡¡msg.setAsynchronous(true);
¡¡¡¡}
¡¡¡¡return queue.enqueueMessage(msg, uptimeMillis);
¡¡¡¡}
¡¡¡¡ÁíΪÈç¹ûÊÇͨ¹ýMessage.Obtain(),»ñÈ¡µÄ¸´ÓÃMessageÒ²»áΪÆ丳ֵ¡£
¡¡¡¡¶à˵һ¾ä£¬Handler.obtainMessage()µ÷ÓõľÍÊÇMessage.Obtain()¡£
¡¡¡¡public final Message obtainMessage(){
¡¡¡¡return Message.obtain(this);
¡¡¡¡}
¡¡¡¡×ܽ᣺
¡¡¡¡Í¨¹ýһϵÁеİüº¹Øϵ£¬×îÖÕLooper¡¢Handler¡¢Message¡¢MessageQueue¼´·¢Éú¹ØÁª£¬´Ó¶øÐγÉÒ»¸ö±ÕºÏ£¬¿ªÆôÏûϢѻ·¡£
¡¡¡¡
¡¡¡¡À§»ó
¡¡¡¡×î½üÒ»Ö±ÔÚ¿´Õâ·½ÃæµÄ֪ʶ£¬µ«ÊÇÄÜÁ¦ÓÐÏÞ£¬»¹ÊÇÓв»ÉÙÀ§»ó£¬Èç¹ûÓдíÎ󣬻òÄãÀí½âÏÂÃæµÄÎÊÌâÇëÁªÏµÎÒfvaryu@qq.com,Ô¸Óë¾ý½»Á÷ѧϰ£¬Ð»Ð»
¡¡¡¡1¡¢MessageÖеÄsPool£¬ÄÄÀï³õʼ»¯µÄ?ΪʲôMessage.obtain()Öв»»áÅ×Òì³£?
¡¡¡¡2¡¢ActivityThread²¢²»ÊÇỊ̈߳¬ÎªÊ²Ã´¿ÉÒÔ´´½¨Ò»¸öLooper£¬Main Threadʲôʱºò´´½¨?
¡¡¡¡3¡¢ÎªÊ²Ã´ÐòÁл¯Á˵ĶÔÏó¾Í¿ÉÒÔ´«µÝ?ÓëBinderÓйØ?
¡¡¡¡4¡¢MessageQueue¶ÔÓ¦µÄÊÇNativeMessageQueue£¬¾ßÌåʵÏÖÐèҪѧϰ?
¡¡¡¡5¡¢Loop.loop()£¬»áÍ˳öÂð?Í˳öʱ»úÊÇʲô?Èç¹û»áÍ˳ö£¬ÄÇôÖ÷Ïß³ÌͬÑù»áÍ˳öÂð?
תÔØÇë×¢Ã÷£º ÎÄÕÂתÔØ×Ô£º°®Ë¼×ÊÔ´Íø http://www.aseoe.com/show-17-848-1.html