2012-03-17 9 views
8

私のアプリケーションでは、いくつかの変数を宣言したクラスがあります。static問題は、アプリケーションが破棄されたときにすべての変数がリセットされないという値です。
アプリケーションが破棄されたときにすべての静的変数の値をリセットする方法はありますか?ただし、個別にリセットする場合はonDestroy()静的データを消去するonDestroy()

答えて

10
class MySettings { 
    // final can't be changed 
    public static final String CONSTANT = "ucantchangeme"; 

    // static - all Objects have just these - even different Acitivities etc 
    public static String sUserName; 

    // class instance members - each Object you create with new has its own version 
    public String mUserName; 

    public MySettings() { 
     mUserName = "uninitialized"; 
    } 

    public static void init() { 
     sUserName = "Peter"; 
    } 

    public static void reset() { 
     sUserName = null; 
    } 
} 

/* Your Activity */ 
class MyActivity extends Actitivy { 
    private MySettings mSettings; 
    private MySettings mOtherSettings; 

    onCreate() { 
     // init those static parts of MySettings 
     MySettings.init(); 

     mSettings = new mSettings(); 
     mSettings.mUserName = "Peter" 
     Log.d("TAG", "Username: " + mSettings.mUserName); 
     // prints Peter 

     // this could also be another Activity 
     mOtherSettings = new MySettings(); 
     Log.d("TAG", "Username: " + mOtherSettings.mUserName); 
     // prints "uninitialized" 

     MySettings.sUserName = "Jim"; 
     Log.d("TAG", "Username: " + MySettings.sUserName); 
     // prints "Jim" 

     mSettings.sUserName = "Joe"; 
     Log.d("TAG", "Username: " + MySettings.sUserName); 
     Log.d("TAG", "Username: " + mSettings.sUserName); 
     Log.d("TAG", "Username: " + mOtherSettings.sUserName); 
     // all print "Joe" now 
    } 

    onDestroy() { 
     // clear MySettings 
     MySettings.reset(); 
    } 
} 

あなたはnullに静的変数をリセットしたりしたい任意の値ではなく、他のもののために静的変数を使用してすることができ、その後の定数は、通常は悪い考えである - それは通常悪いクラスのデザインだとあなたが観察されたもののような予期しない動作につながることができます。

静的変数の値は限りクラスがロードされるよう持続します - それは、アクティビティのライフサイクル(onCreate、...、onDestroy)を行うにはほとんど何もしてい

あなたがコードからクラスに初めてアクセスそれはロードされ、それからそれをアンロードする理由がなくなるまで消えません。その間、アプリ内からのもの(技術的には同じプロセス内 - 通常はそれぞれの.apkが独自のものを使用します)は、それらの統計情報から同じ値を読み取ります。あなたが別の場所から変更すると、変更を知らない他の部分のためにそれを変更します。それが悪い理由です。

Androidがクラスをアンロードする唯一の理由はアプリはメモリから完全に削除されます。これは、タスクキラーを介して、またはあなたのアプリがアクティブでなくなってメモリが不足している場合です。それはあなたのコントロールから完全に外れており、あなたのアプリが使われている間は起こらないはずです。例えば、電話がかかってきて、あなたのアプリは後で再開します。

+0

私は今やっていることはまったく同じですが、静的変数がたくさんあるので、リセットする必要があるので、これを行うにはより良い方法や清潔な方法があれば考えていました。 – noob

+0

'reset()'のように手動で行う場合にのみ動作します。あなたがそれらの多くを持っているなら、あなたはおそらく[反映](http://java.sun.com/developer/technicalArticles/ALT/Reflection/)ですべてのフィールドのループでそれを行うことができますが、私はそれをしません。 – zapl

1

これは不可能です。あなたのアクティビティが破棄されたときには、静的変数をクリアする必要があります。 静的変数が他のアクティビティで宣言され、他のアクティビティが破棄される可能性があります。

Activity loses almost all the references once get destroyed. 
+0

変数は、アクティビティではない別のクラスで宣言されています。最初のアクティビティが開始されると、それらは初期化されます。しかし、アプリケーションを終了して値をチェックすると、値が保持されます。 – noob

+0

ですので、手動で消去する必要があります。アクティビティのonDestroy()でstaticvariable = ""/null; –

4

onDestroy()では、...これらのstatic variablesヌル値を設定することができ

EDIT: を含むクラスは、それらがでVMにロードされたときに

Static variablesが作成され、初期化されますクラスローダークラスが でアンロードされるかVMが終了すると、静的変数は "poof"になります。 がありますが、一般的にクリアする必要はありません。

あなたは(アプリケーション内)onTerminate() メソッドまたは(活動中)onDestroy()方法でそれらをクリアすることができたい場合、私が思う、 しかし多くのポイントはそうではありません、とありますこれらの2つの方法のいずれかが呼び出されるという保証はありません。

(VMの「契約」の重大な違反)作成したときに、変数神経質何らかの理由 がクリアされていない場合、あなた はonCreate()方法でそれらをクリアすることができます。

0

アクティビティスターがあなたの変数をチェックするとき。アクティビティが破棄されると、すべての変数が再び初期化されます。変数の値を確認してください。 アクティビティが破棄されると、あなたの可変値は同じです。変数の値が初期化されたときにそれを確認します。

またはDestroyメソッドで再初期化された変数。静的変数= ""または静的変数= null。

+0

静的変数はインスタンスごとに初期化されません。それらはインスタンスにではなくクラスにバインドされています。 – Praveen

0

静的変数をリセットすると、静的変数が静的でなくなり、静的変数以外の変数も使用できます。

実際、指定された静的変数の動作とAndroidのアプリのライフサイクルとの間に同期性がないため、その方が効果的です。

関連する問題