2009-07-22 70 views
6

以下是協議:我有一個Android應用程序需要每X秒(當前爲60秒)調用Web服務。此應用程序有多個選項卡,這些選項卡都需要與數據本身進行交互。一個是MapView,一個是ListView,然後第三個不相關,但最終還需要獲取一些全局數據。問題是我希望我的主要活動有一個在後臺運行的線程,獲取結果,然後指示TabHost中的兩個子活動使用最新數據更新自己。另外,當用戶點擊選項卡並且onCreate/onResume活動觸發時,我還想通過從主活動獲取最新數據來強制重繪。我真的很茫然。我已經嘗試過使用服務和一些貧民窟靜態方法來將活動的實例傳遞給服務,以便每當定時器啓動時調用特定的函數來更新其視圖,但減速非常糟糕,代碼只是醜陋醜陋難看。有什麼建議麼?在Android TabHost應用程序中完成活動間通信的最佳方式

編輯:所以我在tabhost活動中將它實現爲一個定時器驅動的線程,然後在每個子活動中都有計時器驅動的線程,然後獲取數據(以同步的方式)並更新它們的映射/列表。它的速度更快,但還是感覺稍微砍十歲上下,特別是部分在那裏我打電話,像這樣在父活動的自定義函數:

((MainActivity)getParent()).getNearbyMatches(); 

這增加了我不是完全激動強耦合的元素但是從性能的角度來看,它要好得多。我很欣賞已經給出的答案,並會對內容提供商方面進行一些研究,但我不確定我是否想回到服務模型。

+0

我希望我也知道如何做到這一點!+1 – cakeforcerberus 2009-07-22 15:05:54

回答

7

所以我找到了我相信的答案:The Application Class。您可以擴展此類以跟蹤全局應用程序狀態。

AndroidManifest.xml文件中,您可以在android:name屬性中引用完全限定的自定義類,它將在應用程序啓動時實例化。

任何Activity然後可以調用"getApplication()",它將返回您的自定義應用程序類的實例,然後您可以量身定做。

+0

以及如何在接收機級內檢查它應該啓動的活動是否已在運行? – bofredo 2013-08-29 12:31:20

1

您可以在Handler s中實現GUI更新,並在您的下載線程中註冊Handler實例。下載線程隨後在新數據到達時將消息發送到處理程序。基本上這是Observer Pattern。 您可以找到如何使用Handler s here的示例(展開'使用第二個線程的示例ProgressDialog'部分)。

5

爲什麼每次新數據可用時都要更新所有兒童活動?這聽起來對我來說效率很低。只更新當前可見的活動。

一個可能的方法是通過custom content provider。讓您的服務將數據源更新爲您的活動,並獲取當前可見的活動以收聽有關此內容的更改。所以基本上,當OnResume被調用時,你註冊到內容提供者,當OnPause被調用時,註銷。

作爲一個經驗法則,永遠不會存儲活動的靜態引用!你會以醜陋的泄漏結束。如果這是您的應用必須至少使用WeakReferences

相關問題