2011-06-08 107 views

回答

1

我打算假設您已經正確地設置了與您的活動進行通信的服務設置。

您可以使用Semaphore在服務執行時阻止UI線程。有很多方法可以做到這一點,但爲了簡單起見,這個Semaphore可能是一個工具類中的靜態字段。

public class UtilityClass { 
    public static final Semaphore LOCK = new Semaphore(0); 
} 

在你的UI線程,你會做這樣的事情:UtilityClass.LOCK.acquire()

在您服務,做您將釋放鎖時:UtilityClass.LOCK.release()

記住一些更多的檢查可能是必要的以確保這種方法沒有錯誤。您需要查看Semaphore文檔。例如,在發佈許可證之前,您可能需要檢查是否存在零數據availablePermits()

我認爲您回答的問題存在,但請注意,在UI線程上阻塞會導致應用程序無響應。換句話說,這種方法不是最佳實踐,應該避免。等等

+1

永遠不要阻止UI線程 – fmo 2012-04-24 21:06:00

+1

我沒有不建議這是個好主意。但是OP特別提出了「如何」這樣做。這是一種方法。 – 2012-04-30 00:53:56

+0

但如果我的活動onCreate我需要從服務的數據,我可以等到服務結束?好的,我阻止了UI線程,但是我有其他方法嗎? – Accollativo 2014-11-03 23:04:31

1

我可以告訴你,你應該永遠,永遠可以使UI線程等待:

總之,這是你的應用程序的用戶界面的響應速度至關重要,以保持UI線程暢通。

這是來自Painless Threading的Android開發者頁面,您應該完整閱讀。無論如何你真的想做什麼?

1

一個解決方案:

  • 在UI活動,以創建一個Handler來propertly讀&寫變量(例如在OnCreate函數創建)
  • 把廣播接收器的UI活動
  • 當你的服務終止,發送廣播消息
  • 你的UI活動將收到的廣播接收器
  • 波什的消息牛逼你的指令到處理器

鍵字教程:

  • 廣播接收機
  • sendBroadcast(意向)
  • 處理程序後可運行

希望它可以幫助