我有問題困擾着我。AsyncTask和Thread/Runnable之間的區別
想象一下,我想在另一個線程中做點什麼,就像在SDK文檔中推薦的獲取GPS/Location東西一樣,必須使用後臺線程。
因此,這裏的問題:什麼是通過AsyncTask
和
創建Thread thread1 = new Thread(new Runnable()
...和實施run()
創建在後臺
Thread
之間的區別?
我有問題困擾着我。AsyncTask和Thread/Runnable之間的區別
想象一下,我想在另一個線程中做點什麼,就像在SDK文檔中推薦的獲取GPS/Location東西一樣,必須使用後臺線程。
因此,這裏的問題:什麼是通過AsyncTask
和
創建Thread thread1 = new Thread(new Runnable()
...和實施run()
創建在後臺Thread
之間的區別?
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線程。
另外請注意,從Android v4.04開始,除非您失去與較低版本的兼容性,否則一次不能有一個以上的AsyncTasks。意識到!
你可以,如果你使用'executeOnExecutor()'(你可以有條件地做,所以你不會失去兼容性)。 – matiash
AsyncTask類的一個顯而易見的缺點是,在Android 3.0之後,asynctasks按照開始時間的順序執行。即除了通過調用'executeOnExecutor(Executors.newCachedThreadPool())'來執行任務之外,任務會逐個執行。這個方法會創建你自己的線程池。
主要差異:
AsyncTask是一個異步任務是由在後臺線程運行的計算定義,其結果發表在UI線程上。除非您在UI線程上使用Handler
併發布消息或通過實現適當的同步直接更改對象的屬性,否則無法用普通線程完成。
所建議的關於Thread performance開發人員指南,
有幾個重要的性能方面要記住。首先,默認情況下,應用程序將其創建的所有AsyncTask對象推送到單個線程中。因此,它們以串行方式執行,並且與主線程一樣,特別長的工作包可以阻塞隊列。出於這個原因,我們建議您僅使用AsyncTask來處理持續時間短於5ms的工作項目。。
但正常的Thread可用於長時間運行的任務。
純java線程對Android來說並不是很有用,不像HandlerThread,它已經由Android框架提供。
方便的類用於啓動具有活套的新線程。然後可以使用循環來創建處理程序類。請注意,start()仍然必須被調用。
請參閱以下職位瞭解詳細內容:
做不過請注意,根據版本的Android的代碼運行時,只能有一個的AsyncTask在任何時間運行。 –
@AlexGittemeier即使在這些版本中,您也可以通過使用executeOnExecutor並告訴它使用一個池而不是僅僅調用execute來告訴它運行更多。 –
AsyncTask:進程完成後的響應,線程:進程完成。 –