引言
最近在後臺上
看到有很多人
留言
,說在
面試或者晉升
考核中都遇到了關於
Handler、Binder
機制的
難題
,相信大家在
金九銀十
這個
面試季
中也會遇到類似的
難題
,現在
面試官
的
問題
都是根據你做過的
專案
進行深入探討,如若對
技術原理
和
底層邏輯
沒有深入瞭解的話,那麼你透過面試的機會會
顯著下降
近期也是
收集並整理
了關於
Android Framework
的邏輯
知識點
總結和
Handler、Binder
機制的
學習手冊
,相信能夠解決大家對
底層邏輯,技術原理,原始碼解析,面試真題
等等相關技術知識點得不夠了解透徹的問題,下面為大家展示一下
Handler、Binder
機制的相關
面試真題例項
面試真題例項
Handler 被設計出來的原因?有什麼用?
一種東西被設計出來肯定就有它存在的意義,而 Handler 的意義就是切換執行緒
作為
Android 訊息機制
的主要成員,它管理著所有與
介面
有關的
訊息事件
,
常見的使用場景有:
跨程序
之後的
介面訊息處理
比如
Activity 的啟動
,就是
AMS
在進行
程序間通訊
的時候,透過
Binder 執行緒
將訊息傳送 ApplicationThread 的訊息處理者
Handler
,然後再將訊息
分發
給主執行緒中去
執行
網路互動
後切換到
主執行緒
進行
UI 更新
當
子執行緒
網路操作之後,需要切換到
主執行緒
進行
UI 更新
總之一句話,Hanlder 的存在就是為了解決在子執行緒中無法訪問 UI 的問題
Handler 執行緒是如何切換的?
假設現在有一個執行緒 A
,在 A 執行緒中透過 Looper。prepare 和 Looper。loop 來開啟 Looper,並且在A執行緒中例項化出來一個 Handler
Looper.prepare() 方法被呼叫時會為會初始化 Looper 併為 ThreadLocal 設定 Looper
,此時 ThreadLocal 中就儲存了 A 執行緒的 Looper;另外 MessageQueue 也會在 Looper 中被初始化
接著當呼叫 Loop.loop 方法時
,loop 方法會透過 myLooper 得到A執行緒中的 Looper,進而拿到 Looper 中的 MessageQueue,接著開啟死迴圈等待執行 MessageQueue 中的方法
此時,再開啟一個執行緒 B
,並在 B 執行緒中透過 Handler 傳送出一個 Message,這個 Message 最終會透過 sendMessageAtTime 方法呼叫到 MessageQueue 的 equeueMessage 方法將訊息插入到佇列
由於
Loope r的 loop 是一個死迴圈
,當 MessageQueue 中被插入訊息的時候,loop 方法就會取出 MessageQueue 中的訊息,並執行 callback;而此時,Looper 是 A 執行緒的 Looper,進而呼叫的 Message 或者 Handler 的 Callback 都是執行在 A 線成中的;以此達到了
執行緒的切換
Handler 記憶體洩漏的原因是什麼?
通常在使用 Handler 的時候回透過匿名內部類的方式來例項化 Handler
,而非靜態的匿名內部類預設持有外部類的引用,即匿名內部類 Handler 持有了外部類;而導致
記憶體洩漏
的根本原因是是因為
Handler 的生命週期與宿主的生命週期不一致
比如說在
Activity 中例項化
了一個
非靜態
的
匿名內部類 Handler
,然後透過 Handler 傳送了一個
延遲訊息
,但是在訊息還未執行時結束了 Activity
此時由於 Handler 持有 Activity
,就會導致 Activity 無法被 GC 回收,也就是出現了
記憶體洩漏
的問題
什麼是 Binder?
直觀來說,
Binder 是 Android
中的一個
類
,它
繼承了 IBinder 介面
從 IPC 角度來說:
Binder
是
Android
中的一種
跨程序通訊方式
,Binder 還可以理解為一種
虛擬
的
物理裝置
,它的裝置驅動是 /dev/binder,該通訊方式在 linux 中沒有
從 Android Framework 角度來說:
Binder 是 ServiceManager 連線各種 Manager(ActivityManager、WindowManager,etc)和相應ManagerService 的橋樑
從 Android 應用層來說:
Binder
是
客戶端和服務端
進行通訊的
媒介
,當你 bindService 的時候,服務端會返回一個包含了服務端業務呼叫的 Binder 物件,透過這個 Binder 物件,客戶端就可以獲取服務端提供的服務或者資料,這裡的服務包括普通服務和基於 AIDL 的服務
為什麼要使用 Binder?
效能:
移動裝置
中如果廣泛的使用
跨程序通訊機制
肯定會對通訊機制提出嚴格的要求,而 Binder 相比較傳統的程序通訊方式更加的高效
安全:
由於
傳統程序通訊方式
沒有對通訊的
雙方和身方
做出嚴格的
驗證
,只有上層協議才會去架構,如 socket 連線的 IP 地址可以人為的偽造;而
Binder 身份校驗也是 android 許可權模式的基礎
Binder 的工作流程是什麼樣的?
性客戶端首先獲取伺服器端的代理物件
,所謂的代理物件實際上就是在
客戶端
建立一個服務端的
“引用”
,該代理物件具有
服務端的功能
,使其在客戶端訪問服務端的方法就像訪問本地方法一樣
性客戶端
透過呼叫伺服器代理物件的方式向伺服器端傳送請求
性代理物件將使用者請求
透過 Binder 驅動傳送到伺服器程序
性伺服器程序處理使用者請求
,並透過 Binder 驅動返回處理結果給客戶端的伺服器代理物件
隨著面試過程中你的回答
,
面試官
就會聯想到更多的
技術知識點
,以此來了解你的
技術面有多廣
,
適不適合該職位
,或者能不能往
更高的職位
上發展,
全方位
地
考察
你對
技術
的
理解深度
,以及
解決問題的能力
為了幫助大家更好學習
Android Framework 框架層
必備的
底層邏輯,技術原理,原始碼解析,面試真題
等等相關技術知識點相關的問題,這裡
特別提供
一份由
騰訊大佬
所整理的一張
Android Framework 思維導圖
及其
配套
的一份
學習手冊
;有需要
思維導圖及學習手冊
的朋友:
可以私信傳送 “進階”
即可 直達獲取
;希望大家看完之後,能夠
查漏補缺
思維導圖及學習手冊內容展示如下:
Android Framework 思維導圖
高畫質版 Android Framework 思維導圖獲取方式:私信傳送 “進階”即可 直達獲取
從原始碼角度談談 Handler 的應用
Handler 的應用
執行緒間的通訊
實現延時操做
使用
HandlerThread
在非同步執行緒執行耗時操做
使用
Handler
機制檢測應用中的卡頓問題
Handler 使用注意事項
Handler 機制之 Thread
執行緒概念
Android 執行緒的實現
執行緒的阻塞
關於執行緒上下文切換
關於執行緒的安全問題
守護執行緒
執行緒的記憶體
完整版 Android Framework 思維導圖及學習手冊 獲取方式:私信傳送 “進階”即可 直達獲取
Handler 機制之 ThreadLocal
Java 中的 ThreadLocal
ThreadLocal 的前世今生
Android 中的 ThreadLocal
Android 面試中的關於 ThreadLocal 的問題
ThreadLocal 的結構
ThreadLocal 靜態類 ThreadLocal。Values
ThreadLocal 的總結
應用程式與 AMS 的通訊實現
從應用程式程序到管理者程序
應用程式程序向管理者程序傳送訊息
從管理者程序到應用程式程序
管理者程序嚮應用程式程序傳送訊息
使用者程序接收訊息
完整版 Android Framework 思維導圖及學習手冊 獲取方式:私信傳送 “進階”即可 直達獲取
應用程序與 WMS 的通訊實現
WindowManagerImpl & WindowManagerGlobal
ViewRootImpl
從應用程序到管理者程序
從管理者程序到應用程序
應用程序之間的通訊實現
服務端編寫 AIDL 檔案
編寫 Service
宣告 Service
客戶端編寫 AIDL 檔案
繫結服務,並呼叫
IBinder實現原理
完整版 Android Framework 思維導圖及學習手冊 獲取方式:私信傳送 “進階”即可 直達獲取
機遇往往是留給有準備的人,一個好的機遇往往就能讓你一飛沖天;但機遇即使到了你身邊,你卻沒有能力留住它,那麼它還是會從你的身邊溜走,所以我們一定要在有限的時間內,將自己的技術打磨好,不斷的吸取新知識,努力提升自己的知識水平和技術層次,只有這樣,你才能在機遇降臨到你身邊的時候,你才能夠牢牢的抓住它
既然選擇了程式設計師這個行業,那麼你一定要做好充足的準備;要想在人前顯貴,背後所付出的辛勞和汗水就是必須的
Android 架構師之路還能漫長,與君共勉