2012-04-25 47 views
0

我對此感到困惑。剛剛開始使用android,並且需要多個活動才能將對象集合在一起。我想將活動中的對象傳遞給活動來構建它。在閱讀了許多帖子和博客以及Android Dev頁面之後,對於非持久性數據來說,最好的辦法是對應用程序進行子類化或創建一個單例。我查閱了這篇文章openFileOutput not working properly inside a singleton class - ideas/workarounds?,現在我的問題是這樣的,爲什麼沒有一個單身人士被回收?如果我們在Activity A中創建Singleton(),然後移動到Activity B,並且我們永遠不會傳遞對單例的引用,那麼垃圾回收器如何知道我們會再次回到它呢?在我看來,當活性A被回收,我們搬到了活動B的單會死..在android中,爲什麼單身人士永遠不會回收?

如果我們看一下下面的單..

public final class SomeSingleton implements Cloneable { 

    private static final String TAG = "SomeSingleton"; 
    private static SomeSingleton someSingleton ; 
    private static Context mContext;  

    /** 
    * I'm private because I'm a singleton, call getInstance() 
    * @param context 
    */ 
    private SomeSingleton(){ 
     // Empty 
    } 

    public static synchronized SomeSingleton getInstance(Context context){ 
     if(someSingleton == null){ 
     someSingleton = new SomeSingleton(); 
     } 
    mContext = context.getApplicationContext(); 
    return someSingleton; 
    } 

    public void playSomething(){ 
     // Do whatever 
     mContext.openFileOutput("somefile", MODE_PRIVATE); // etc... 
    } 

    public Object clone() throws CloneNotSupportedException { 
     throw new CloneNotSupportedException("I'm a singleton!"); 
    } 
} 

,我們創建一個實例它通過getInstance(),該類將類的單個實例放置到靜態字段someSingleton中。爲什麼這個實例從未被回收?如果答案是「靜態字段永遠不會被回收?」如果我們有很多這樣的東西,是什麼使我們不會忘記我們所有的記憶?簡單的設計考慮?如果我們使用大量的我們不知道有多少靜態字段的貢獻庫,這看起來似乎有風險。我只是有這樣的感覺,即我在OOP中缺少一些基本規則作爲newb。

回答

1

一般模式是在靜態字段中引用您的單例類。靜態字段不綁定到特定的實例,因此它們會一直存在,直到JVM進程處於活動狀態。有多少活動訪問它並不重要。如果你需要'回收'單身人士,你可能不需要使用單身人士嗎?或者提供一個明確的close()/open()等方法。

+0

謝謝,我更新了我的原始問題,以便更具體。我仍然有點困惑。 – 2012-04-25 16:32:07

+0

在Java中,因此在Android中,如果對象沒有可訪問的引用,則對象只會收集垃圾回收(GC)。由於靜態字段總是可訪問的,如果你將某些東西放在靜態字段中並且永遠不清除它(設置爲「空」),它將不會被GC編輯。雖然這對單身人士來說是行得通的,因爲你通常希望它是可訪問的而不是GC編輯的。至於內存,有很多方法可以耗盡內存:只需創建列表並開始在循環中添加新對象。最終你會得到一個內存不足的錯誤,你的進程將被終止。 – 2012-04-25 16:45:11

0

我認爲你的單身人士沒有得到回收的原因是因爲在你認爲他們是Android時,活動並沒有被破壞。

您提出了一個問題,例如「當我們從活動A移動到B時發生了什麼」。但是當你在Android中這樣做時,活動A很少會被銷燬。它通常會進入onPause()狀態。因此,如果用戶決定按下足夠多的時間返回到活動A,則活動A仍然(大部分)完好無損。