0

我对此感到困惑。刚开始使用 android 并且有一个很长的表单,需要多个活动来组合一个对象。我想将对象从一个活动传递到另一个活动来构建它。在阅读了许多帖子和博客以及 Android Dev 页面之后,似乎对于非持久数据,最好的选择是子类化应用程序或创建单例。我查看了这篇文章openFileOutput 在单例类中无法正常工作 - 想法/解决方法?现在我的问题是,为什么单身人士没有被回收? 如果我们在 Activity A 中 createSingleton() ,然后移动到 Activity B 并且我们永远不会传递对单例的引用,那么垃圾回收器如何知道我们将再次回到它?在我看来,当活动 A 被回收并且我们已经转移到活动 B 时,单身人士将会死去。

如果我们看下面的单例..

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 中缺少一些基本规则。

4

2 回答 2

1

一般模式是将对单例类的引用放在静态字段中。静态字段不绑定到特定实例,因此它们会一直存在,直到 JVM 进程处于活动状态。有多少活动访问它并不重要。如果您需要“回收”单例,也许您真的不需要使用单例?或提供明确的close()/open()等方法。

于 2012-04-25T02:34:47.087 回答
0

我认为你的 Singleton 没有被回收的原因是因为你认为 Android 中的活动没有被销毁。

您提出了一个问题,例如“当我们从活动 A 转移到 B 时会发生什么”。但是当你在 Android 中这样做时,Activity A 很少被破坏。它通常只是进入onPause()状态。因此,如果用户决定点击后退按钮足够多的时间以返回活动 A,那么您的活动 A 仍然(大部分)完好无损。

于 2012-04-25T16:36:48.903 回答