2011-12-30 67 views
4

當需要在不同線程中完成一些工作時,通常建議在Android中使用Handler.post()
當我想在後臺做一些工作時,建議我開始ServiceAndroid中的Thread.run()和Handler.post()和Service有什麼區別?

但我使用new Thread (new Runnable(){...});爲我所感到更加方便。

但是恐怕手動創建新線程的行爲在Android中可能會有所不同,比如當內存不足時自動停止,而使用Service可能不會?

希望明確的答案能幫助我擺脫這種困惑。 ^^從UI

回答

7

在進行Android中的某些工作是大大建議使用處理程序,因爲:

在Android中一個只能更新在其原來的線程,即,它們被創建的線程的意見,否則應用程序可能會引發一個例外說

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

Android中的處理程序與創建它們的線程綁定。每個Handler實例都與單個線程和該線程的消息隊列相關聯。當您創建一個新的處理程序時,它將綁定到正在創建它的線程的線程/消息隊列 - 此後,它將消息和可運行消息傳遞到該消息隊列,並在消息出來時執行它們隊列。所以處理程序是Android中最安全的。

雖然服務,繼承人從http://developer.android.com/reference/android/app/Service.html

一段代碼什麼是服務?

有關服務類最混亂實際上都是圍繞着它不是什麼:

服務沒有單獨的進程。服務對象本身並不意味着它在自己的進程中運行;除非另有說明,否則它與它所屬的應用程序在相同的過程中運行。

服務不是線程。它不是一種自己的方式來處理主線程(以避免應用程序不響應錯誤)。 因此服務本身其實很簡單,提供了兩個主要特點:

一種設施爲應用程序告訴系統的東西,它希望在後臺(做即使用戶不直接與應用程序交互)。這對應於對Context.startService()的調用,它要求系統安排服務的工作,直到服務或其他人明確停止它爲止。

應用程序將其某些功能公開給其他應用程序的工具。這與對Context.bindService()的調用相對應,該調用允許與服務進行長期連接以與其進行交互。

而且最後線程,

線程來執行一些重非視圖功能,一些繁重的計算工作方式類似解析等,以便它不會阻止你的用戶界面和安全地完成所有的工作...

+0

謝謝。我發現在PhoneGap中,它爲webview的每個請求使用線程。所以它可能安全且容易使用線程。 – Aloong 2012-03-16 07:01:14

2

調用線程違背了單線程模型:Android的UI工具包不是線程安全的,必須總是在UI線程操作。這就是爲什麼以下內容正像空替代代替ofusing螺紋直接

  • Activity.runOnUiThread(可運行)
  • View.post(可運行)
  • View.postDelayed(運行的,長)
  • 處理程序

處理程序使用UI線程和後臺線程 的AsyncTask是用來做一些小任務重的背景

之間進行通信

如果你在後臺最輕的工作,然後使用處理程序更加重了後臺工作使用的AsyncTask並做後臺應用服務

最重的工作見http://android-developers.blogspot.com/2009/05/painless-threading.html

  • 要添加或刪除列表視圖中的數據可通過處理
  • 使用從服務器獲取XML數據和反映這些在你看來使用 AsynTask。的AsyncTask比螺紋
  • 要播放的音樂文件利用服務
0

處理程序是在一個特定的線程運行代碼件更佳。到目前爲止,最常見的用例是當你在工作線程上下文中並且想要在主(UI)線程上運行某些東西時......在這種情況下,你將在你的主線程上初始化一個Handler(例如初始化時) ,並從worker線程發佈()一個Runnable。

Thread.run()是基本的Java線程入口點。當你需要一個後臺線程來執行一些I/O或繁重的計算時,你可以實現這一點,除了在Android上你通常不會這麼做,因爲它的很多更容易使用AsyncTask,其中你爲工作線程重寫doInBackground()代碼(也就是通常實現run()的地方),並且在工作任務完成後用你想要在UI線程上運行的代碼覆蓋onPostExecute()。

服務是完全不同的東西......它們不是線程。服務代碼將與您的UI一起在您的主線程上運行。你仍然可以使用AsyncTask等,或者使用一種稱爲IntentService的特殊服務,它可以在工作線程上工作。