2012-05-31 40 views
0

我有一個android應用程序,其中包含許多活動。 我有一個單獨的類持有我的主要數據模型,所有活動訪問獲取數據。Android上的主要數據模型

的問題是,有時在Android GC決定毀了我單身時在後臺應用程序(當您按下home鍵)。 無論如何,我可以繞過這個嗎?

回答

1

我在我的當前應用程序,它需要保留的各種「單」類大量數據的有這種確切的問題。我遇到的問題與你的情況一樣;即有時在將應用程序帶回前臺時,某些靜態的「單例」類已被破壞。

的問題,相信,是,這樣的類的「壽命」永遠不能被良好限定的或預測。畢竟,這是一個坐在那裏的課程,它提供了對自身的引用,因此當系統想要獲取一些資源時,它很容易被垃圾收集。

你可能已經意識到,延長android.app.Application是一個衆所周知的替代使用常規單身。爲我工作的解決方案是將數據單例類的實際實例保存在android.app.Application的擴展類中,其生命週期已定義良好。任何其他想要訪問這些單例的類都可以在Application類中使用吸氣器來獲得它們。

因此,例如,我有一個叫AppState擴展Application類,保存中的實例:

import android.app.Application; 

public class AppState extends Application { 
    ... 

    // "Singleton" instances that this Application extension looks after 
    private MSData singletonInstanceMSData; 


    public AppState() { 
     ... 
     singletonInstanceMSData = new MSData(); 
     ... 


    // ---------------- Singleton instance control ---------------- 

    public MSData getMSData(){ 
     return singletonInstanceMSData; 
    } 


    // I also provide the means to 'reset' the instances on startup (this is 
    // something I need to do for my application - you may or may not need to) 
    public void resetControllerSpecificData(){ 
     singletonInstanceMSData.reset(); 
     ... 

不要忘記,你需要修改你的清單,如果你擴展Application

+0

謝謝您的回答。之前我已經閱讀過這個解決方案,而且這個解決方案是正確的還是錯誤的都有爭議。如果你說這一個適用於你,我會試試看,儘管我真的不明白它們有什麼區別:我的意思是,如果我的應用程序進入後臺並且操作系統決定殺死它,它將如何「知道」如何恢復'AppState'類的最後狀態? –

+0

如果系統在應用程序處於後臺時會殺死整個進程,那麼當您下次啓動應用程序時,應用程序將從頭開始運行。然後,它將像啓動時一樣構建單例結構,並且都可以。實際的問題是應用程序沒有被殺死,因此當你下一次啓動應用程序時,它會被恢復,但是* singleton類已經GC'd,這意味着應用程序在斷開狀態下恢復;即它正在恢復,但它在啓動時創建的單例現在缺失。使用'Application'是因爲它總是停留在周圍。 – Trevor

1

AFAIR,壽命OS單是他的類加載器的壽命 - 也完全VM。當用戶點擊主頁按鈕時,你的應用程序會以backgorund進入並可能被破壞 - 你無法對它做任何事情。最好的辦法是保存任何在你的onPause()回調是必要的(或者只是使用datza的每一個變化直寫,如果你真的偏執)

+0

感謝您的回覆。我也考慮過這種解決方案,但我仍然有問題:我也有一個服務 - 粘滯服務 - 操作系統也可能會殺死,並且會重新啓動(粘性服務...)。現在,服務沒有'onPause()',所以它不能以這種方式保存狀態......如果你對第二個解決方案有問題,那就太好了! –