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

本文發佈於個人博客html

此文章爲「譯文」,原文連接:www.mergeconflict.net/2012/05/jav…java

翻譯已獲原做者受權。水平有限,若有缺漏,懇請指正,謝謝~android

前言

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

  • Java Threadasync

  • Android 原生 AsyncTask輔助類post

二者不必定能分出個孰優孰劣,所以瞭解他們各自的使用場景,對您的優化性能是有必定的好處的。性能

AsyncTask 的使用場景

  • 不須要下載大量數據的簡單網絡操做優化

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

Java Thread 使用場景

  • 涉及中等或大量的網絡數據操做(包括上傳和下載).net

  • 須要在後臺執行的 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()方法區別不大

參看:

相關文章
相關標籤/搜索