我对此感到困惑。刚刚开始使用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