2011-09-02 59 views
4

我一直在尋找相當一段時間來獲得一些很好的文檔或者一個很好的例子。我需要從後臺運行的服務中的工作線程對主要活動UI進行更改。據我所知,我知道我想用某種處理程序工作,但我不確定如何處理這個問題。從服務中的線程對主活動UI進行更改

有沒有人有任何想法或好的例子,他們可以指導我?我正在改變的UI元素是一個TextView,它只是通知用戶線程的狀態。

感謝您的幫助。

回答

7

所有你所要做的就是創建UI線程上Handler

private Handler serviceHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     someFunctionInTheUIThread(); 
    } 
}; 

然後通過你的服務通過此。你可以有一個功能,在服務這樣的:

public void registerHandler(Handler serviceHandler) { 
    handler = serviceHandler; 
} 

,然後通過傳遞處理程序是這樣的:

theService = ((LocalBinder) service).getService(); 
theService.registerHandler(serviceHandler); 

然後發回一個消息:

Message msg = handler.obtainMessage(IDENTIFIER, "Message or data"); 
handler.sendMessage(msg); 
+0

如果我從服務中的線程或onStartCommand發送消息,會有關係嗎?我計劃從兩者發送。 – gtdevel

+0

處理程序的美妙之處在於它們跨線程工作 - 請閱讀http://developer.android.com/reference/android/os/Handler.html。 「Handler允許你發送和處理與一個線程的MessageQueue相關的Message和Runnable對象,每個Handler實例與一個線程和該線程的消息隊列相關聯,當你創建一個新的Handler時,它綁定到線程/消息隊列創建它的線程 - 從這一點開始,它將向消息隊列傳遞消息和可運行消息,並在消息隊列出來時執行它們。「 – Martyn

+0

因此,如果我的服務中有一個工作線程,它不會與服務在同一個線程中運行,是嗎?這是否意味着我必須讓兩個處理程序從服務方法發送消息,然後從該線程發送消息?很抱歉,如果這些是愚蠢的問題,但線程混淆我。 – gtdevel

2

調查服務綁定。或者您可以在主要活動中使用BroadcastReceiver接收來自服務的廣播。

1

你有通過sendBroadcast(intent)從您的服務中發送意圖,並在您的活動中設置BroadcastReceiver

+0

我試過,但我遇到了一些問題。我會嘗試處理程序,然後看看我能否讓廣播接收機工作... 謝謝。 – gtdevel

1

在主要活動中的onCreate()方法中創建一個處理程序。這將在UI線程中創建一個處理程序。然後使用工作線程中的這個處理程序,調用任何你需要的來獲得更新的TextView。