Android 多執行緒

Android中,Main Thread又可稱為UI Thread,而其他的Thread皆可稱為Worker Thread。

Thread

Thread(用在與UI無關的事情)

  • 不要把UI thread給block住
  • 不要在UI toolkit之外存取UI Threa

Thread類別中,並沒有thread執行完成的通知機制,如果想讓thread做完事情後進行通知的動作,那就必須透過handler的訊息發送機制,在thread做完事後,送訊息至訊息佇列。 這樣,想知道這個thread完成的事件的,就可以去訊息佇列接收完成的通知訊息。 thread在start()後,會在建立一個thread來執行run() method,可以在run method裡的主要工作做完後,用 handler的sendEmptyMessage(),傳送一個任務完成的訊息到訊息佇列。

Thread的生命週期

AsyncTesk(非同步執行緒)

AsyncTask允許我們的執行一個異步的任務在後台。我們可以將耗時的操作放在異步任務當中來執行,並隨時將任務執行的結果返回給我們的UI線程來更新我們的UI控件。通過AsyncTask我們可以輕鬆的解決多線程之間的通信問題。 除了 doInBackground 方法之外的三個方法,都不是必須有的

使用方法:

  1. 建立一個類別繼承自AsyncTask類別,AsyncTask後面可以傳入三個參數:分別供「params」、「progress」和「result」使用。

    • 「params」為doInBackground()方法傳入參數型別。

    • 「progress」為onProgressUpdate()方法傳入參數型別。

    • 「result」為doInBackground()的回傳值型別及onPostExecute()方法的傳入參數型別。

  1. 根據需要覆載:onPreExecute()、doInBackground()、onProgressUpdate()和onPostExecute()方法:

    • 「onPreExecute()」:在AsyncTask啟動時呼叫一次,可用來初始化需要的資源,也可以更新UI元件。

    • 「doInBackground()」:AsyncTask主要工作程式碼,不可以更新UI元件。

    • 「onProgressUpdate()」:當publishProgress()被呼叫時被觸發,可更新UI元件。

    • 「onPostExecute()」:當doInBackground()執行完畢時被呼叫,可更新UI元件。

AsyncTesk Thread+Handler的比較

差異:

  • AsyncTask目的在於提供簡單易用的方式來達成Handler+Thread的功能;AsyncTask只要定義幾個Callback就可以做到Handler+Thread+Message Queue+Looper才能做到的事情。

  • 因為Main Thread可以隨時透過Handler發送Message給Thread,而AsyncTask只能依照事先定義Callback進行工作,沒有隨時發送Message的機制。因此,Handler+Thread在即時互動上會比AsyncTask優秀。

  • 由於Handler+Thread依靠Message Queue來跟Main Thread互動,相對於AsyncTask,Handler+Thread比較可能發生堵塞的狀況。

  • AsyncTask內部以較新且較強的java.util.concurrent類別來實作,缺點是較佔資源,而Handler+Thread內部則為基本的Java Thread實作而成。

結論:

  • 基於易用與可靠性,Android官方建議使用AsyncTask來執行背景工作。

  • 基於Android裝置環境有限的資源,當執行單一的工作時建議使用AsyncTask(如下載一個大檔案);但是當執行大量重複性的工作時,建議使用Handler+Thread(如下載多個小圖)。

results matching ""

    No results matching ""