Handler異步與同步執行的巧妙之處

最近忽然想起Handler這個設計,再結合Python,JavaScript,RxJava這些常常遇到的一些回調好像是執行在一個異步線程,但實際不是。以後忽然想到一個問題,Android應用UI線程實際就是ActivityThread的Main函數中執行,你們都知道在一個應用進程建立時就會執行Main函數,同時會初始化一個基於mainThread的Handler,同時這個線程進入異步

Looper.loop();

無線循環!!!函數

那麼此時問題出來了,既然UI線程一直運行在死循環中,爲何咱們應用程序卻能和咱們相互交互。若是這個Looper.loop()是運行再HandlerThread中那就很好理解了,但問題不是啊!oop

固然你們都會想到應用程序能和咱們作交互就是經過Handler啊,可是具體這個原理是怎麼樣的,相信通常人首先會丈二和尚摸不着頭腦,二般的人就沒必要浪費時間往下看了哈哈哈線程

 

好,我帶着這個好奇進源碼翻了一圈,如今總結以下設計

一、Handler若是是一個異步的話,那由於Looper.loop()執行再異步線程中,因此對咱們來講很好理解。進程

二、UI上的Handler主要是由於一個應用進程在最初建立時,由launcher啓動,下面作一個列表更好說明ip

Launcher ——> startActivity  // Launcher進程中
經過Binder切換到AMS進程 startActivity  // AMS進程
在AMS進程中會先從Zygote fork一個應用進程出來  // AMS進程
此時進入了ActivityThread Main 函數中  // 進入應用進程,同時Handler循環開啓
繼續執行一些應用的初始化工做,Application,Instrumentation,Context,Activity 的初始化工做,這裏已經開始
經過BInder使用Handler進行初始化了  // 這裏執行在AMS進程中,經過binder切換到Handler
切換到Handler後會回調Application、Activity的回調方法(onCreate,onResume等)// 此時經過Handler回到了UI線程

好,以上一言以蔽之,大概意思就是,UI線程處於無限循環,但還能夠與咱們進行交互的主要緣由就是應用最初建立時因爲AMS進程的參與給了UI線程的回調,有了這個開始那UI線程就能夠開始以後與咱們進行交互了經過Handler源碼

相關文章
相關標籤/搜索