2012-04-25 2 views
0

私はこれに混乱しています。単にアンドロイドを開始し、オブジェクトをまとめるために複数のアクティビティを必要とする長いフォームを持っています。私はオブジェクトをアクティビティからアクティビティに渡して構築したいと考えています。多くの投稿やブログ、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に欠けているいくつかの基本的なルールがあるというこの気持ちを持っています。

答えて

1

一般的なパターンは、シングルトンクラスへの参照を静的フィールドに入れることです。静的フィールドは特定のインスタンスに結び付けられていないため、JVMプロセスが生き残るまで固執します。どのくらいのアクティビティにアクセスしても問題ありません。シングルトンをリサイクルする必要がある場合は、実際にシングルトンを使用する必要はありませんか?または明示的にclose()/open()などの方法を提供してください。

+0

ありがとう、私はより具体的な私の元の質問を更新しました。私はまだ少し混乱しています。 –

+0

Javaでは、アンドロイドのため、アクセス可能な参照がない場合、オブジェクトはガベージコレクション(GC)のみを取得します。 staticフィールドに何かを貼り付け、それを決してクリアしない( 'null'に設定する)場合、静的フィールドは常にアクセス可能であるため、GC-edされません。しかし、シングルトンの場合は一般的にアクセス可能でGCではないことが望ましいので、これは問題ありません。メモリに関しては、それを消耗させる方法がたくさんあります。リストを作成してループに新しいオブジェクトを追加するだけです。最終的にメモリ不足エラーが発生し、プロセスが強制終了されます。 –

0

あなたのシングルトンがリサイクルされていない理由は、Androidのアクティビティがあなたが思っていると破壊されないためです。

あなたは「アクティビティAからBに移行するとどうなるか」という質問をします。しかし、あなたがAndroidでそれを行うと、アクティビティAは非常にまれにが破棄されたです。通常は、onPause()状態になります。したがって、ユーザーがアクティビティAに戻るために十分な時間、戻るボタンを押すことに決めた場合、あなたのアクティビティAは(ほとんど)そのままです。

関連する問題