2011-08-05 84 views
125

爲什麼我在這裏的大多數問題的答案中讀了很多關於AsyncTask和裝載機的問題,但是沒有任何關於Services?服務是不是很好知道,或者他們被棄用或有一些壞的屬性或什麼?有什麼區別? (順便說一下,我知道還有其他線索,但是沒有一個真正說明清楚的差異,這些差異可以幫助開發人員輕鬆地決定他是否更適合使用這個或那個實際問題。)Android:AsyncTask vs服務

回答

248

在某些情況下,它能夠對任何一個AsyncTaskService但通常是一個更適合比另一個任務來完成相同的任務。

AsyncTask s設計用於一次性耗時的任務,無法運行UI線程。一個常見的例子是按下按鈕時獲取/處理數據。

Service s被設計爲在後臺持續運行。在按鈕按下時獲取數據的上述示例中,您可以啓動一個服務,讓它獲取數據,然後停止它,但效率不高。使用一次運行AsyncTask的速度要快得多,返回數據並完成。

如果你需要不斷地在後臺做某些事情,那麼Service是你最好的選擇。這方面的例子包括播放音樂,不斷檢查新數據等。

另外,正如Sherif所說,服務不一定會從UI線程中流失。

在大多數情況下,Service適用於當您要運行代碼時,即使應用程序的Activity未打開。 AsyncTask s旨在使UI線程的執行代碼非常簡單。

+4

我覺得你真的理解我的問題!謝謝 – erikbwork

+2

有趣的是,在2010年的Google I/O中,http://www.youtube.com/watch?v=xHXn3Kg2IQE這位演講者給出了3種不同的從REST API獲取數據的方法,第一種使用服務。我不是Android專家,但我也有一個印象,即電腦技術所說的基本上是正確的。 – wuliwong

+8

最後一段,「即使您的應用程序的」活動未打開「,當您想要運行代碼時,服務也適用。 AsyncTask或後臺線程也是如此。即當你按下你的活動或調用finish()並且你的活動不可見時,但是你的後臺線程仍在執行,直到你終止你的應用程序進程(例如通過從最近的任務中交換)。我已經用4.4.2 Google Nexus AOSP grouper檢查了這個 –

55

Services完全不同:服務不是線程

您的活動綁定到服務,並且該服務包含一些被調用時阻止調用線程的函數。您的服務可能用於將溫度從攝氏溫度更改爲度數。任何綁定的活動都可以獲得此服務。


然而AsyncTask是主題,做在後臺的一些工作,並在同一時間必須報告結果返回給調用線程的能力。

只是一個想法:一個服務可能有AsyncTask對象!

+1

儘管服務被描述爲在後臺運行,但即使關閉了應用程序,也會繼續運行。 AsyncTask也被用於在後臺執行某些操作。明白我的意思了嗎? – erikbwork

+1

是的,但服務可能會或可能不會做某事。他們是一個持久的對象 –

+6

當我寫這篇文章的時候,我非常年輕 –

5

服務是一個守護進程,AsynkTask是後臺線程

+29

服務不是守護進程,因爲它沒有自己的執行線程。 –

+4

IntentService有 – Malachiasz

6

Service是Android框架的組件之一,它不需要用戶界面執行,這意味着即使應用程序沒有被用戶主動使用,也可以用服務執行一些操作。這並不意味着服務將在單獨的線程中運行,但它在主線程中運行,並且可以在需要時在單獨的線程中執行操作。 實例用途正在播放中的背景音樂,而無需用戶交互等

AsyncTask上另一方面用於UI阻擋要在一個單獨的線程執行的任務在與化背景服務器同步數據。這與創建新線程並執行任務完全相同,因爲創建和維護線程以及將結果發回主線程的所有任務都由AsyncTask負責。示例用法是從服務器獲取數據,對內容解析器等進行CRUD操作

+0

你能指定爲什麼你認爲你的答案增加了任何問題嗎? – erikbwork

+1

其他答案對於初學者來說太短或太長,無法理解。所以我用簡單的話來回答具體的例子 – arjun

3

服務asynctasks幾乎做同樣的事情,幾乎。採用服務或的AsyncTask取決於你的需求是什麼。

,如果你想打一些按鈕或改變屏幕後加載數據從服務器列表視圖您更好地使用asynctask.it去一個例子與運行主UI線程並行(在後臺運行)。對於運行asynctack活動或者你的應用程序應該在主UI線程上。從應用程序退出後,沒有任何asynctask。

但服務不是這樣的,一旦你開始一個服務,它可以運行後,你退出應用程序,除非你停止service.like我說這取決於你的requirements.if你想保持檢查數據接收或者不斷檢查網絡狀態,最好使用服務。

快樂編碼。

+1

嗨Ashana,我可以問你爲什麼提供這個答案的問題已經回答了嗎?你對現有的明顯答案不滿意嗎?或者你是否試圖通過將你的觀點寫入你有話要說的所有問題來建立一個SO配置文件?或者完全不同的東西?無法弄清楚,但最近我經常看到這種模式。 – erikbwork

+1

雅我知道答案已經給出,我沒有看到很多問題,如果我在這裏給出正確的答案或我的意見兄弟?因爲你不是唯一一個尋找相同問題答案的人,如果有人很難理解上述答案中的解決方案,他/她可以向下滾動尋找適合他們的答案,很容易理解它。這就是它。感謝評論兄弟,我不是一個天才或專業編程,只是想幫助別人,嘗試教別人我已經知道的:) –