2011-07-08 7 views
0

プログラム実行中にさまざまなクラスによってアクセスされる多数の静的変数を持つ 'DataReference'というクラスがあります。未知の理由で静的変数がリセットされています

私は1つの変数 'public static int particlePercent = 100;'を持っています。メインメニューアクティビティの 'SettingView'アクティビティからのみ変更できます。

メインメニューアクティビティの 'GameView'アクティビティを終了すると、 'ParticlePercent'変数は常に 'SettingView'から値が編集されていても100にリセットされます。

変数は静的で、「SettingView」アクティビティ以外で編集されていないものと同じであることが期待されます。

あなたは何が起こっているのか、私が状況をさらに明確にする必要があるかどうか知っていれば教えてください。

ありがとうございました。

+0

変数へのアクセスと設定の両方のコードを確認したいと思います。別のオプションは問題のコードをデバッグすることです。私はAndroid開発用のIntelliJを使用しており、素晴らしいデバッガを持っています。 –

答えて

2

原因が同じかどうかわかりませんが、私はこの問題にかなりの回数ぶつかりました。 Androidはメモリ不足のときに変数をリセットします。このスレッドはあなたにもっと役立つかもしれません - Android : Static variable null on low memory

+0

私はこれについて検討しますが、プログラムのメモリ使用量はごくわずかです。提案していただきありがとうございます! – Leif

0

別スレッドに設定されていますか?複数のスレッドがこの値にアクセスしていて、別のスレッドで変更されている場合、他のスレッドが同期アクセスなしで変更を見ることは保証されません。

+0

はい。 1つのアクティビティコール 'SettingView'は、変数を変更する唯一のものです。それ以外はすべて値にアクセスします。しかし、変数はメインゲームスレッドが実行された後に元の値にリセットされるだけですか?だから、どうなっているのかよくわからない。しかし、私はこの可能性を調べて、私がこのバグを解くことができるかどうかをお知らせします – Leif

0

静的変数はクラスに属し、クラスのインスタンスではありません。

初期値はどこに設定されていますか?

リセットの仕組みを確認するためのオプションがいくつかあります。あなたが何を再設定しているのか、それともいつまで設定されているのかを見たい場合。

  1. 変数を静的に設定しますが、プライベートにして、パブリック静的ゲッターとセッターを作成します。その後、セッターにブレークポイントを設定してデバッグします。それが設定されている場合(設定されている場合)、スタックがどのように設定されているのか、何が何であるのかを見ることができます。
  2. これはあなたのお茶ではない場合は、常に例外をスローしてすぐにそれをキャッチし、スタックトレースを印刷することができます。これはあなたのために同じことを行います - コールスタックを表示すると、どのコードがそれを再設定しているかを見ることができます。
+0

問題の変数が100に初期化されているので、クラスが何らかの形で初期化されていて、静的varsとインスタンス化されることはありません。 私はあなたの提案がどのように変数にアクセスしているのかを見てみるつもりです。 – Leif

2

あなたは、Android documentationで図にアプリケーションを一時停止された任意のプロセスを見ることができるように、停止または破壊、それが殺されることがあります。 diagram

を、それが殺された場合、すべてのクラスがメモリから削除されていますしたがって、すべての静的変数は失われます。これは、現在のアクティビティを変更するとすぐに発生します。

この問題を解決するには、このような変数を何らかの形で保存する必要があります(たとえば、アクティビティのonSaveInstanceState)。

関連する問題