還是ActivityThread這段代碼。來(lái)自Android中為什么主線程不會(huì)因?yàn)長(zhǎng)ooper.loop()里的死循環(huán)阻塞?
我們知道APP的入口是在ActivityThread,一個(gè)java類,有著main方法,而且main方法中的代碼也不是很多.
public static void main(String[] args) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain"); SamplingPRofilerIntegration.start(); // CloseGuard defaults to true and can be quite spammy. We // disable it here, but selectively enable it later (via // StrictMode) on debug builds, but using DropBox, not logs. CloseGuard.setEnabled(false); Environment.initForCurrentUser(); // Set the reporter for event logging in libcore EventLogger.setReporter(new EventLoggingReporter()); AndroidKeyStoreProvider.install(); // Make sure TrustedCertificateStore looks in the right place for CA certificates final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId()); TrustedCertificateStore.setDefaultUserDirectory(configDir); Process.setArgV0("<pre-initialized>"); Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); } // End of event ActivityThreadMain. Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }在上篇文章MessageQueue與Looper的由來(lái)我們得知這段代碼中的Looper.prepareMainLooper()在主線程中創(chuàng)建了一個(gè)Looper對(duì)象,然后在這段代碼的末尾處,調(diào)用了Looper.loop()方法,我們來(lái)看看Looper.loop()源碼:
從這個(gè)loop()方法中邏輯就比較明了了,里面有一個(gè)死循環(huán),從消息隊(duì)列中不斷的取出消息,然后調(diào)用這個(gè)方法msg.target.dispatchMessage(msg),msg.tagre為當(dāng)初你創(chuàng)建的Handler對(duì)象,因?yàn)樵贖andler把消息放入消息隊(duì)列的時(shí)候執(zhí)行了以下代碼:
可以看到這里把創(chuàng)建的Handler賦值給了msg.target。然后msg.target.dispatchMessage(msg)就相當(dāng)于handler.dispatchMessage(msg),所以我們來(lái)看看Handler的dispatchMessage()方法:
如果看過(guò)第一篇Handler消息發(fā)送我們就可以了解到Handler是如何發(fā)送消息的,所以看到這段代碼就應(yīng)該知道這些消息或者是回調(diào)是如何發(fā)送的了。
根據(jù)自己的理解,繪制了以下流程圖,如有錯(cuò)誤,請(qǐng)及時(shí)提醒我改正:
這個(gè)系列是本人寫(xiě)的第一篇比較完成的博客,肯定會(huì)有非常多的不足,希望大家能夠多留言批評(píng),希望能明確指出文章中可能有的錯(cuò)誤,我會(huì)及時(shí)更正,謝謝。
系列目錄:
一定搞懂Handler消息處理機(jī)制系列之「01.Handler消息發(fā)送」
一定搞懂Handler消息處理機(jī)制系列之「02.Message入列」
一定搞懂Handler消息處理機(jī)制系列之「03.MessageQueue與Looper的由來(lái)」
一定搞懂Handler消息處理機(jī)制系列之「04.Message是如何觸發(fā)的」
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注