異步消息處理機制相關面試問題
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()為異步方法,可以執行耗時操作。