我对此感到困惑。刚刚启动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中缺少一些基本规则作为新手。
答案 0 :(得分:1)
一般模式是在静态字段中引用单例类。静态字段不依赖于特定实例,因此它们会一直存在,直到JVM进程处于活动状态。有多少活动访问它并不重要。如果你需要'回收'单身人士,你真的不需要使用单身人士吗?或者提供明确的close()/open()
等方法。
答案 1 :(得分:0)
我认为你的单身人士没有被回收的原因是因为你认为Android中的活动没有被破坏。
你提出了一个问题,比如'当我们从活动A转移到B'时会发生什么。但是当您在Android中执行此操作时,活动A很少已销毁。它通常只是进入onPause()
状态。因此,如果用户决定按下后退按钮足以返回活动A,您的活动A仍然(大部分)完好无损。