Android面試__非同步訊息處理機制
非同步訊息處理機制相關面試問題
Handler
什麼是Handler
Handler通過傳送和處理Message與Runnable物件來關聯相對應執行緒MessageQueue。
1. 可以讓對應的Message和Runnable在未來的某個時間點進行相應處理
2. 讓自己想要處理的耗時操作放在子執行緒,讓更新UI的操作放在主執行緒
handler的使用方法
- post(runnable)
- sendMessage(message)
handler的機制原理
handler引起的記憶體洩漏以及解決辦法
原因:靜態內部類持有外部類的匿名引用,導致外部activity無法釋放
解決方法:handler內部持有外部acitivity的弱引用,並把handler改為靜態內部類,在onDestory()中mHandler.removeCallback().
AsyncTask
什麼是AsyncTask
本質上是一個封裝了執行緒池和handler的非同步框架
使用方法
三個引數
5個方法
AsyncTask機制原理
- AsyncTask的本質是一個靜態的執行緒池,AsyncTask派生出的子類可以實現不同的非同步任務,這些任務都是提交到靜態的執行緒池中執行。
- 執行緒池中的工作執行緒質細膩個doInBackgrond(mParams)方法執行非同步任務
- 當任務狀態改變之後,工作執行緒會向UI執行緒傳送訊息,AsyncTask內部的InternalHandler響應這些訊息,並呼叫相關的回撥函式
注意事項
- 記憶體洩漏(與Handler相似)
- 生命週期(與Handler相似,應在Activity銷燬時,呼叫cancel())
- 結果丟失(與Handler相似,都是因為持有了Activity的引用)
- 並行or序列
handlerThread
handlerThread是什麼
產生背景
開啟Thread子執行緒進行耗時操作,但是多次建立和銷燬執行緒是很耗費系統資源的
本質
本質上是一個handler+thread+looper,是一個thread內部有looper
3.特點
- HandlerThread本質上是一個執行緒類,它繼承了Thread;
- HandlerThread有自己的內部Looper物件,可以進行looper迴圈;
- 通過獲取HandlerThread的looper物件傳遞給Handler物件,可以在handlerMessage方法中執行**非同步任務**。
- 優點是不會有阻塞,減少了對效能的消耗,缺點是不能同時進行多工的處理,需要等待進行處理,處理效率低。
- 與執行緒池注重併發不同,HandlerThread是一個序列佇列,HandlerThread背後只有一個執行緒。
handlerThread原始碼解析
IntentService
含義
優先順序比普通的Service高,內部封裝了handlerThread()與handler的非同步框架。
IntentService是繼承並處理非同步請求的一個類,在IntentService內有一個工作執行緒來處理耗時操作,啟動IntentService的方式和啟動傳統的Service一樣,同時,在所有任務執行完後,IntentService會自動停止,而不需要我們手動去控制或stopSelf()。另外,可以啟動IntentService多次,而每一個耗時操作會以工作佇列的方式在IntentService的onHandleIntent()回撥方法中執行,並起,每次只會執行一個工作執行緒,執行完第一個再執行第二個(序列)。
- 本質是一種特殊的Service,繼承自Service並且本身就是一個抽象類
- 內部通過HandlerThread與Handler實現非同步操作
使用方法
複寫構造方法與onHandleIntent(),onHandleIntent()為非同步方法,可以執行耗時操作。