2013-07-04 88 views
52

我有問題困擾着我。AsyncTask和Thread/Runnable之間的區別

想象一下,我想在另一個線程中做點什麼,就像在SDK文檔中推薦的獲取GPS/Location東西一樣,必須使用後臺線程。

因此,這裏的問題:什麼是通過AsyncTask

  • 創建Thread thread1 = new Thread(new Runnable() ...和實施run()

    1. 創建在後臺Thread之間的區別?

  • 回答

    40

    AsyncTask是做一個新的線程一些工作,並從中得到了所謂的完成當線程(通常是UI線程)上使用的結果一個方便的類。它只是一個使用幾個runnables的包裝器,但它處理創建線程和處理線程間消息傳遞的所有複雜性。

    AsyncTask支持正確和方便地使用UI線程。該類允許執行後臺操作並在UI線程上發佈結果,而無需操縱線程和/或處理程序。

    AsyncTask被設計成圍繞線程和處理程序的助手類,並不構成通用線程框架。理想情況下,AsyncTasks應該用於短操作(最多幾秒)。如果您需要保持線程長時間運行,強烈建議您使用java.util.concurrent pacakge提供的各種API,例如執行器,ThreadPoolExecutor和FutureTask。

    異步任務由在後臺線程上運行並且其結果在UI線程上發佈的計算定義。異步任務由3個泛型類型定義,稱爲Params,Progress和Result,以及4個步驟,分別稱爲onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

    Runnable接口是Java線程的核心。 Runnable接口應該由其實例旨在由線程執行的任何類來實現。

    另外,如果我從this blog引用:

    ,如果你需要簡單的編碼使用的AsyncTask,如果你需要速度使用傳統的Java線程。

    +0

    做不過請注意,根據版本的Android的代碼運行時,只能有一個的AsyncTask在任何時間運行。 –

    +1

    @AlexGittemeier即使在這些版本中,您也可以通過使用executeOnExecutor並告訴它使用一個池而不是僅僅調用execute來告訴它運行更多。 –

    +1

    AsyncTask:進程完成後的響應,線程:進程完成。 –

    1

    另外請注意,從Android v4.04開始,除非您失去與較低版本的兼容性,否則一次不能有一個以上的AsyncTasks。意識到!

    +5

    你可以,如果你使用'executeOnExecutor()'(你可以有條件地做,所以你不會失去兼容性)。 – matiash

    0

    AsyncTask類的一個顯而易見的缺點是,在Android 3.0之後,asynctasks按照開始時間的順序執行。即除了通過調用'executeOnExecutor(Executors.newCachedThreadPool())'來執行任務之外,任務會逐個執行。這個方法會創建你自己的線程池。

    1

    主要差異:

    1. AsyncTask是一個異步任務是由在後臺線程運行的計算定義,其結果發表在UI線程上。除非您在UI線程上使用Handler併發布消息或通過實現適當的同步直接更改對象的屬性,否則無法用普通線程完成。

    2. 所建議的關於Thread performance開發人員指南,

      有幾個重要的性能方面要記住。首先,默認情況下,應用程序將其創建的所有AsyncTask對象推送到單個線程中。因此,它們以串行方式執行,並且與主線程一樣,特別長的工作包可以阻塞隊列。出於這個原因,我們建議您僅使用AsyncTask來處理持續時間短於5ms的工作項目。

      但正常的Thread可用於長時間運行的任務。

    純java線程對Android來說並不是很有用,不像HandlerThread,它已經由Android框架提供。

    方便的類用於啓動具有活套的新線程。然後可以使用循環來創建處理程序類。請注意,start()仍然必須被調用。

    請參閱以下職位瞭解詳細內容:

    Handler vs AsyncTask vs Thread