2012-06-10 185 views
3

Activity啓動的ActivityService運行後臺線程是否有區別? 加入:後臺線程不會與用戶界面進行交互。Android後臺線程:從活動啓動和服務啓動之間的區別

我目前有一些後臺線程從Activity啓動。大多數是通過AsyncTask和一個是通過我自己的ExecutorService。我想知道重構代碼以將它們移到ServiceIntentService是否有重大好處。

+1

這取決於你的'AsyncTasks'做什麼。 AsyncTask的意義在於它充當後臺線程和Activity UI之間的橋樑。如果您不需要任何與UI進行前/後交互或進行線程正在執行的更新,則不需要「AsyncTask」。因此,您可以簡單地在您的'Activity'中調用一個通用的'Thread',或者將其轉換爲'Service'。 – Squonk

+0

一個服務可以出來活動,我相信一個AsyncTask不能。像Squonk說的那樣,用AsyncTask進行UI交互更容易。 – Ran

回答

3

您似乎對活動和服務的定義感到困惑。要清楚:

  • 活動是根據活動的生命週期狀態機運行的東西。相應處理程序中的代碼與附加到UI的事件循環進行交互。
  • 服務是根據服務生命週期狀態機運行的東西。相應生命週期處理程序中的代碼執行操作以處理諸如Intent等等的事情,但而不是通過UI與用戶交互。

這兩項,然而,應用程序的「主線」上運行。本身,活動或服務(或廣播接收器,內容提供商等)是而不是的一個線程。看看文檔,你會發現Activity和Service類實際上並不構成一個線程。相反,它們是將在Android框架內運行的鉤子,並且該框架將在適當的時候在應用程序的「主」線程上調用它們。

您可以創建單獨的應用程序線程,或使用AsyncTask來做工作並輕鬆地將其發佈到UI線程(使用服務不那麼容易實現)。

+0

謝謝。我知道活動和服務的定義,它們如何處理主線程,並且我可以在UI線程上創建單獨的線程或'AsyncTask'。我想知道從「活動」或「服務」中獲得的差異。 – mparaz

+1

@mparaz關於他們如何處理,他們應該沒有什麼不同。也就是說,在一個服務中啓動一個線程將不會以與在一個活動中不同的方式處理。 –

1

綁定到活動的線程具有相同的生命週期。因此,如果您重新啓動/終止活動,該線程也會重新啓動/終止。如果您不管理活動的生命週期,這是一個問題。在這種情況下服務是很好的。您可以銷燬活動,並且仍然有一個工作線程在後臺運行(在服務中)。但請注意,如果Android系統需要資源(例如內存),它將首先終止服務(然後根據其Sticky標誌重新啓動它們)。在我看來,由於您控制了活動的工作流程,因此從活動更改爲服務沒有任何實際好處。如果線程很重(並且剎那間),可以考慮將它們放在一個單獨的進程中的服務上(在AndroidManifest中放置服務的進程名稱)。

在Android文檔:

注意:使用工作者 線程在您的活動意外重新啓動時,由於運行時 配置的變化可能會遇到(當用戶更改屏幕如另一個問題 方向),這可能會破壞你的工作線程。要了解如何在這些重新啓動過程中以及如何正確地取消任務時取消該任務,請參閱源代碼 以瞭解Shelves示例應用程序。

+1

**所以如果您重新啓動/終止活動,該線程也將被重新啓動/終止。** - 是和否。例如,在屏幕方向改變的情況下,可以堅持一個'AsyncTask'並重新附加'Activity'。 – Squonk

+0

謝謝。你見過將線程移動到另一個進程的好處嗎?我不明白這會如何改善它,並且我相信在單獨的過程中運行會有開銷。 – mparaz

+1

我已經看到很大的CPU/IO線程(解析15MB的XML和寫入數據庫)的好處。 – oxygenpt

相關問題