2012-04-25 48 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仍然(大部分)完好无损。