1. 程式人生 > >Android面試__非同步訊息處理機制

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的非同步框架

使用方法

  1. 三個引數

  2. 5個方法

AsyncTask機制原理

  1. AsyncTask的本質是一個靜態的執行緒池,AsyncTask派生出的子類可以實現不同的非同步任務,這些任務都是提交到靜態的執行緒池中執行。
  2. 執行緒池中的工作執行緒質細膩個doInBackgrond(mParams)方法執行非同步任務
  3. 當任務狀態改變之後,工作執行緒會向UI執行緒傳送訊息,AsyncTask內部的InternalHandler響應這些訊息,並呼叫相關的回撥函式

注意事項

  • 記憶體洩漏(與Handler相似)
  • 生命週期(與Handler相似,應在Activity銷燬時,呼叫cancel())
  • 結果丟失(與Handler相似,都是因為持有了Activity的引用)
  • 並行or序列

handlerThread

handlerThread是什麼

  1. 產生背景

    開啟Thread子執行緒進行耗時操作,但是多次建立和銷燬執行緒是很耗費系統資源的

  2. 本質

    本質上是一個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()為非同步方法,可以執行耗時操作。

原始碼解析