私のアプリケーションでは、いくつかの変数を宣言したクラスがあります。static
問題は、アプリケーションが破棄されたときにすべての変数がリセットされないという値です。
アプリケーションが破棄されたときにすべての静的変数の値をリセットする方法はありますか?ただし、個別にリセットする場合はonDestroy()
?静的データを消去するonDestroy()
答えて
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がクラスをアンロードする唯一の理由はアプリはメモリから完全に削除されます。これは、タスクキラーを介して、またはあなたのアプリがアクティブでなくなってメモリが不足している場合です。それはあなたのコントロールから完全に外れており、あなたのアプリが使われている間は起こらないはずです。例えば、電話がかかってきて、あなたのアプリは後で再開します。
これは不可能です。あなたのアクティビティが破棄されたときには、静的変数をクリアする必要があります。 静的変数が他のアクティビティで宣言され、他のアクティビティが破棄される可能性があります。
Activity loses almost all the references once get destroyed.
変数は、アクティビティではない別のクラスで宣言されています。最初のアクティビティが開始されると、それらは初期化されます。しかし、アプリケーションを終了して値をチェックすると、値が保持されます。 – noob
ですので、手動で消去する必要があります。アクティビティのonDestroy()でstaticvariable = ""/null; –
onDestroy()
では、...これらのstatic variables
にヌル値を設定することができ
EDIT: を含むクラスは、それらがでVMにロードされたときに
Static variables
が作成され、初期化されますクラスローダークラスが でアンロードされるかVMが終了すると、静的変数は "poof"になります。 がありますが、一般的にクリアする必要はありません。
あなたは(アプリケーション内)onTerminate() メソッドまたは(活動中)onDestroy()
方法でそれらをクリアすることができたい場合、私が思う、 しかし多くのポイントはそうではありません、とありますこれらの2つの方法のいずれかが呼び出されるという保証はありません。
(VMの「契約」の重大な違反)作成したときに、変数神経質何らかの理由 がクリアされていない場合、あなた はonCreate()
方法でそれらをクリアすることができます。
アクティビティスターがあなたの変数をチェックするとき。アクティビティが破棄されると、すべての変数が再び初期化されます。変数の値を確認してください。 アクティビティが破棄されると、あなたの可変値は同じです。変数の値が初期化されたときにそれを確認します。
またはDestroyメソッドで再初期化された変数。静的変数= ""または静的変数= null。
静的変数はインスタンスごとに初期化されません。それらはインスタンスにではなくクラスにバインドされています。 – Praveen
静的変数をリセットすると、静的変数が静的でなくなり、静的変数以外の変数も使用できます。
実際、指定された静的変数の動作とAndroidのアプリのライフサイクルとの間に同期性がないため、その方が効果的です。
- 1. クラスリストの静的メンバーの要素を消去する
- 2. 一時的なリストを消去せずに消去する
- 3. UITableViewデータの消去
- 4. 静的テキストGUIの中の前のデータを消去せずに新しいデータを入力する方法
- 5. Androidウェブビューのデータを消去
- 6. Androidスタジオはユニットテストで静的インポートを自動的に消去します
- 7. jQueryで動的コンテンツを消去する
- 8. 動的なUserControlコンテナを消去する
- 9. WPFで静的メソッドを使用してボタンのコンテンツを消去する
- 10. 消去を使ってベクトルから要素を消去する
- 11. Pysparkでdropnaでデータを消去
- 12. SerialPort - 既存のデータを消去
- 13. sqlite dbからデータを消去
- 14. C#、オーバーラップバックグラウンドイメージの消去部分の消去を防止する
- 15. ジェネリック医薬品、例えば型消去および静的ファブリック方法
- 16. チャッターボットデータベースを消去
- 17. Webpackキャッシュを消去する
- 18. Python:ログファイルを消去する
- 19. PhoneGapキャッシュを消去する
- 20. SQLのデータが消去されない
- 21. データを消去するとサービスを停止する方法は?
- 22. Excel:系列データを更新するチャートスタイルを消去する
- 23. 再帰的特徴消去(RFE)SKLearn
- 24. テーブルに挿入する前にデータを消去する
- 25. 「データを消去する」もアプリケーションを終了させますか?
- 26. データを消去せずにフォームを初期化する
- 27. rowSumとサブセットを使ってデータを消去する
- 28. 消去要素
- 29. マップ消去エラー
- 30. ローカルストレージの消去
私は今やっていることはまったく同じですが、静的変数がたくさんあるので、リセットする必要があるので、これを行うにはより良い方法や清潔な方法があれば考えていました。 – noob
'reset()'のように手動で行う場合にのみ動作します。あなたがそれらの多くを持っているなら、あなたはおそらく[反映](http://java.sun.com/developer/technicalArticles/ALT/Reflection/)ですべてのフィールドのループでそれを行うことができますが、私はそれをしません。 – zapl