2013-01-31 30 views
2

我看到了一個我並不期望在Android上進行垃圾回收的行爲。即使應用程序有對它的引用,類的類成員也是垃圾回收

我有一個擴展名爲應用App和修改清單,使

<應用 機器人類:名稱=

我以前用這個。「應用程序」 ......要能爲了方便起見通過靜態方法獲取應用程序上下文,但是也存儲小而關鍵的信息,這些信息只能在整個應用程序被垃圾收集時收集。這個信息被存儲在存儲在應用程序類被初始化一個singleton對象和參考:

public class App extends Application { 

Context mContext; 
Info info; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    mContext = this; 

    info = Info.getInstance(); 

    this.setTheme(R.style.MyTheme); 
} 

public static Context getContext(){ 
    return mContext; 
} 
} 

當信息被初始化時,一個簡單的構件對象被初始化,以及:

public class Info { 


    public Profile profile; 

    (...) 

    private Info() { 
     profile = new Profile(); 
    } 

    (...) 
} 

問題我經歷過,當應用程序暫停並運行另一個內存密集型應用程序(強制垃圾回收)時,當我返回到應用程序時,在嘗試訪問配置文件時遇到NullPointerException var

Info.getInstance ().profile

不應該因爲應用程序持有對「Info」單例的引用以及單例持有對「profile」引用的事實而導致它不會被垃圾回收?

任何幫助表示讚賞。謝謝!

+0

GC不能收集對象。你的代碼有一個與GC無關的bug。顯示更多代碼) – Leonidos

+0

將其更改爲:private Profile profile; – jdb

+0

@Leonidos:我想了很長一段時間,但我經歷了代碼,除了GC之外,我還沒有發現任何其他解釋。我稍後再看看。謝謝! – lbarbosa

回答

0

瞭解更多關於android應用程序生命週期的知識。如果您啓動另一個需要內存的應用程序,其他應用程序將在後臺被終止。

然後OnCreate應該再次運行,所以它不能是垃圾收集器,因爲信息將從頭再次創建。如果你有難參考

Activity life cycle

+0

這就是爲什麼我在Application類中擁有對象,以便它在應用程序的整個生命週期中保留,或者在整個應用程序被終止的情況下(不僅僅是活動)被重新創建。 – lbarbosa