私はこれに混乱しています。単にアンドロイドを開始し、オブジェクトをまとめるために複数のアクティビティを必要とする長いフォームを持っています。私はオブジェクトをアクティビティからアクティビティに渡して構築したいと考えています。多くの投稿やブログ、Android Devページを読んだら、非永続データのように見えますが、アプリケーションのサブクラス化やシングルトンの作成が最善の方法です。私はこの投稿openFileOutput not working properly inside a singleton class - ideas/workarounds?を見直しましたが、今私の質問はこれですなぜシングルトンはリサイクルされませんか?アクティビティAでSingleton()を作成し、アクティビティBに移動してシングルトンへの参照を決して渡していない場合、ガーベッジ・リサイクラは再びそれに戻ってくることをどのように知っていますか?活動Aがリサイクルされているときに我々はアンドロイドで、なぜシングルトンはリサイクルされませんか?
私たちは、次のシングルトンを見れば..
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!");
}
}
...シングルトンが死ぬアクティビティBに移動したように私には思えるそして、我々はのインスタンスを作成しますそれはgetInstance()を介して、クラスは静的フィールドsomeSingletonにクラスの単一のインスタンスを配置します。なぜこのインスタンスはリサイクルされませんか?答えが「静的フィールドは決してリサイクルされませんか?私たちがたくさんの記憶を持っているなら、私たちは私たちの記憶をすべて使い果たしてしまいます。シンプルな設計上の考慮事項?静的なフィールドがいくつあるのかわからない、多くの貢献したライブラリを使用している場合、これは危険なようです。私はちょうど私がnewbとしてOOPに欠けているいくつかの基本的なルールがあるというこの気持ちを持っています。
ありがとう、私はより具体的な私の元の質問を更新しました。私はまだ少し混乱しています。 –
Javaでは、アンドロイドのため、アクセス可能な参照がない場合、オブジェクトはガベージコレクション(GC)のみを取得します。 staticフィールドに何かを貼り付け、それを決してクリアしない( 'null'に設定する)場合、静的フィールドは常にアクセス可能であるため、GC-edされません。しかし、シングルトンの場合は一般的にアクセス可能でGCではないことが望ましいので、これは問題ありません。メモリに関しては、それを消耗させる方法がたくさんあります。リストを作成してループに新しいオブジェクトを追加するだけです。最終的にメモリ不足エラーが発生し、プロセスが強制終了されます。 –