2012-02-06 54 views
0

假設我有一個負責下載和保存文件的單例類(Downloader)。當客戶端請求下載時,他還必須提供回調。我的問題是關於這些回調對象的存儲。對活動的持久引用 - 生命週期

如果我有一個實現回調接口,然後請求多個大型下載活動,將下載器類將無限期舉行的活動的參考。如果在下載完成之前,請求它們的活動將在其生命週期中完成並被銷燬。

在這種情況下,下載程序將阻止垃圾回收商收集活動垃圾。我不介意請求的下載繼續。然而,我想要做的是不知何故檢測到提供的回調應該收集,我正在有效地泄漏它。

是否有像這樣的設計模式?我在想,其中一個Reference子類將是有用的。

謝謝。

回答

1

反過來,你可以讓他們斷開連接,避免高度不推薦的做法,保持活動的參考。

我創建了一個非常簡單的服務定位器類,保持靜態引用到我所有的單身人士和類型解決他們,但你可以做到這一點更簡單。您只需要一個擁有對您的Downloader靜態引用的類並公開該活動的引用。如果您需要回到任何活動中,請使用Android框架的發佈/訂閱模型(即setOnClickListener(OnClickListener listener))。

下載器可以有一個內接口稱爲DownloadUpdateListener,這個接口的單個​​實例,以及用於設置這個和除去從活動基準的註冊和註銷方法。活動將在本地創建一個DownloadUpdateListener實例,以便可以訪問所有活動的字段和視圖。在下載程序中,在調用其方法之前檢查您的偵聽器是否爲空。在onResume中註冊您的聽衆,並且不要忘記在onPause中註銷它。

+0

訂閱/取消訂閱雖然有效,但有點限制。就我所知,我還使用非活動對象(如適配器)中的Downloader來封裝活動的生命週期。這或者迫使我爲我的適配器實現onPause/onResume方法並在Activity中調用它們,或者使用其他黑客程序 – zienkikk 2012-02-06 22:02:54

+0

然後,您需要像我一樣的ServiceLocator。我可以在我的應用程序的任何地方解決任何問題,因爲我的ServiceLocator擁有對所有單例的靜態引用。 – Rich 2012-02-06 22:06:24

+0

我想我不明白如何有一個ServiceLocator解決這個問題。 Downloader仍然需要保持對回調的引用,對吧? – zienkikk 2012-02-06 22:15:11