「譯」Java Thread vs AsyncTask:該用哪個?

rosuH發表於2018-05-15

本文釋出於我的部落格

此文章為「譯文」,原文連結:www.mergeconflict.net/2012/05/jav…

翻譯已獲原作者授權。水平有限,如有缺漏,懇請指正,謝謝~

前言

在 Android 開發中,有一個非常重要但是較少被討論到的問題:UI 的響應。這個問題一部分由 Android 系統本身決定,但更多時候是還是開發者的責任。拋開其他問題而言,解決 Android 應用 UI 響應問題的關鍵,就是儘可能地讓大部分耗時工作轉移到後臺執行。眾所周知,將耗時任務或是 CPU 密集型任務放到後臺執行的方法,基本上只有兩個:

  • Java Thread

  • Android 原生 AsyncTask輔助類

兩者不一定能分出個孰優孰劣,因此瞭解他們各自的使用場景,對您的優化效能是有一定的好處的。

AsyncTask 的使用場景

  • 不需要下載大量資料的簡單網路操作

  • I/O 密集型任務,耗時可能幾個毫秒以上

Java Thread 使用場景

  • 涉及中等或大量的網路資料操作(包括上傳和下載)

  • 需要在後臺執行的 CPU 密集型任務

  • 當你想要在 UI 執行緒控制 CPU 佔用率時

還有一個老生常談的問題就是,千萬不要在 UI 執行緒(主執行緒)執行網路操作。你需要使用上述兩種方式之一來訪問網路。

關鍵點

Java Thread 和 AsyncTask最關鍵的不同點在於,AsyncTask執行在 GUI 執行緒¹ 上,所以繁重的 CPU 任務都可能導致 UI 響應性下降。Java Thread 可以擁有不同的執行緒優先順序,使用低優先順序的執行緒來完成非實時運算任務能夠很好地為 GUI 操作釋放 CPU 時間。這是提高 GUI 響應性的關鍵點之一。

然而,正如很多 Android 開發者所瞭解的,你無法在後臺執行緒更新 UI 元件,不然就會丟擲異常。這對於 AsyncTask來說並不是什麼大事² ,但是當你使用的是 Java Thread,那麼你必須在你操作結束的時候使用post()來更新 UI³ 。

譯者按原文查詢資料注:

  1. AsyncTask必須在主執行緒載入,其中除了doInBackground(Object [])方法外,其餘三個方法都在 UI 執行緒執行

  2. 基於第一點,AsyncTask可以在其餘三個方法中更新 UI 元件

  3. 可以使用view.post()方法來更新 UI 元件,這個方法和使用Activity.runOnUiThread()方法區別不大

參看:



相關文章