在android中,为什么单身人士永远不会回收?

时间:2012-04-25 02:05:28

标签: android

我对此感到困惑。刚刚启动android并且有一个很长的形式,需要多个活动来汇集一个对象。我想将对象从activity传递给activity来构建它。在阅读了许多帖子和博客以及Android Dev页面之后,对于非持久性数据而言,最好的选择是子类应用程序或创建单例。我查看了这篇文章openFileOutput not working properly inside a singleton class - ideas/workarounds?,现在我的问题是这样,为什么单身人士不会被回收?如果我们在活动A中创建了单一的(),那么转到活动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中缺少一些基本规则作为新手。

2 个答案:

答案 0 :(得分:1)

一般模式是在静态字段中引用单例类。静态字段不依赖于特定实例,因此它们会一直存在,直到JVM进程处于活动状态。有多少活动访问它并不重要。如果你需要'回收'单身人士,你真的不需要使用单身人士吗?或者提供明确的close()/open()等方法。

答案 1 :(得分:0)

我认为你的单身人士没有被回收的原因是因为你认为Android中的活动没有被破坏。

你提出了一个问题,比如'当我们从活动A转移到B'时会发生什么。但是当您在Android中执行此操作时,活动A很少已销毁。它通常只是进入onPause()状态。因此,如果用户决定按下后退按钮足以返回活动A,您的活动A仍然(大部分)完好无损。