update - thread handler example in android




服務,異步任務和線程之間的區別? (5)

從開發者的角度來看:

線程 :用於執行設置以便與主線程並行編碼。 但是你不能處理線程內的UI。 為此你需要使用Handler 。 哈德勒像線程一樣工作,但也可以處理UI。

ASyncTask :用於處理那些無法在主線程上工作的任務。 例如,HTTP請求是非常繁重的工作,無法在主線程上處理,因此您在ASyncTask處理HTTP請求。它與您的主線程在後台中異步地並行工作。它沒有幾個回調方法在其上調用相應的事件。

服務 :是一個後台進程。 當你必須做一些沒有任何與之關聯的UI的處理時,它會被使用。

服務,異步任務和線程有什麼區別。 如果我沒有錯,所有這些都是用來做背景的東西。 那麼,如何決定使用哪個以及何時使用?


線程是並發執行單元。 它有自己的調用堆棧。 有兩種方法可以在應用程序中實現線程。

一種是提供一個擴展Thread並覆蓋run()方法的新類。 另一個是在創建期間提供一個帶有Runnable對象的新Thread實例。 一個線程可以通過調用它的“start”方法來執行。 您可以通過調用其“setPriority(int)”方法來設置線程的“優先級”。

如果您在UI部分中沒有任何影響,則可以使用線程。 例如,您正在調用某個Web服務或下載一些數據,並且在下載後,您將其顯示在屏幕上。 然後,您需要使用帶有線程的處理程序,這會使您的應用程序變得複雜,無法處理來自線程的所有響應。

Handler允許您發送和處理與線程的MessageQueue關聯的Message和Runnable對象。 每個線程都有每個消息隊列。 (就像一個待辦事項列表),線程將會處理每條消息並處理它,直到消息隊列為空。 所以,當處理程序通信時,它只是向調用者線程發送一條消息,並等待處理。

如果您使用Java線程,那麼您需要在自己的代碼中處理以下要求:

  • 如果將結果回發給用戶界面,則與主線程同步無取消線程的默認值無默認線程池在Android中處理配置更改時沒有默認值

的AsyncTask

AsyncTask支持正確和簡單地使用UI線程。 該類允許在UI線程上執行後台操作和發布結果,而無需操作線程和/或處理程序。 異步任務由在後台線程上運行的計算定義,並且其結果在UI線程上發布。

AsyncTask將經歷以下4個階段:

onPreExecute()

在任務執行前在UI線程上調用

doInbackground(PARAMS ..)

onPreExecute()完成執行後立即在後台線程上調用。

onProgressUpdate(進步..)

調用publishProgress(Progress ...)後在UI線程上調用。

onPostExecute(結果)

後台計算完成後在UI線程上調用。
為什麼你應該使用AsyncTask?

易於使用的UI線程。 (所以,當調用者線程是UI線程時使用它)。 無需操作處理程序。

服務 “服務”與“活動”類似,但沒有GUI。

重要提示 :服務不會在新線程中運行!

閱讀關於Service ,並檢查如何總是在後台運行服務


希望有人在幾天前告訴我的更多信息:

  • 您可以在活動和服務之間共享全局變量 - 例如線程。
  • 只要活動或服務仍然存在,您的應用程序及其所有全局變量就不會被清除。
  • 如果您的應用中有服務實例,並且操作系統需要資源,它首先會殺死您的活動,但只要存在服務,操作系統就不會將您的應用和其全局變量一起清除。

我的用例如下所示:我在全局空間中有一個連接到服務器的線程和一個顯示結果的Activity。 當用戶按下主頁按鈕時,活動進入後台並啟動新的服務。 然後,該服務從線程讀取結果,並在需要時在通知區域中顯示信息。 我不擔心操作系統會破壞我的Activity,因為我知道只要Service正在運行,它就不會銷毀該線程。


服務就像活動耗時很長的任務,但異步任務允許我們執行長/後台操作並在UI線程上顯示其結果,而無需操縱線程。


簡而言之,針對time consuming tasks 服務 ,針對short-lived tasks time consuming tasks AsyncTask線程線程standard java construction





java-threads