天天看點

Android面試__異步消息處理機制異步消息處理機制相關面試問題

異步消息處理機制相關面試問題

Handler

什麼是Handler

Handler通過發送和處理Message與Runnable對象來關聯相對應線程MessageQueue。

1. 可以讓對應的Message和Runnable在未來的某個時間點進行相應處理

2. 讓自己想要處理的耗時操作放在子線程,讓更新UI的操作放在主線程

handler的使用方法

  • post(runnable)
  • sendMessage(message)

handler的機制原理

Android面試__異步消息處理機制異步消息處理機制相關面試問題

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()為異步方法,可以執行耗時操作。

源碼解析