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