9

コードにバグがあり、Androidのライフサイクルを完全に理解していないと思いました。はい、私はすべてのドキュメントを読み、図を見ましたが、アクティビティがフォーカスを失ったり、殺されたりする可能性がある場合、データを保存するタイミングについてのみ話しているようです。ただし、私の質問は、状態を保存する必要がない場合、変数とその格納された値はどうなりますか?私はそれらが破壊されることを期待していましたが、私のコードのバグはそうではないことを示しているようです。

私の場合、ここで何が起こったのかです。カスタムビューを起動するアクティビティがあります(xmlは使用せず、カスタムビューの画面にビットマップを描画するだけです)。私が現在アクティビティに持っている唯一の変数は、私のビューの変数です。GameView gameView;

私の見解では、いくつかのビットマップ、描画およびタッチイベントを処理するための単純なintおよびfloat変数を宣言し、小さなビットマップ、各オブジェクトの座標、およびその他のいくつかを含むオブジェクトの1つの配列があります。このオブジェクトのクラスの変数の1つは、オブジェクトの数の現在の数を表す静的変数です。私はこの方法でそれを行ったので、オブジェクトのインスタンス化により、オブジェクトのクラスの外でこれを追跡するのではなく、オブジェクトがどのように人間のオブジェクトであるかを追跡します。

静的変数はすべてのオブジェクトで同じ値を維持することを期待していましたが、onDestroyedがそのアクティビティに対して呼び出されると、この変数が他のすべての変数およびそのアクティビティのビューのオブジェクトとともに破棄されることも期待していました。しかし、それは起こらないようです。このアクティビティが再度起動されると、onDestroyedが呼び出された場合でも、この静的変数には前回の実行からの以前の値が含まれます。

今私の質問はこれを修正する方法ではありません(このバグを修正するために別の方法でコードを書くことができます)が、アプリケーション全体に対してグローバルではなく、内部にのみ存在するため、この静的変数でこれが発生する理由を理解したいと思いますそのアクティビティのビュー?また、これにより、そのビューの残りの変数について疑問に思います-それらは破壊されてメモリが解放されますか、少なくとも次にアクティビティが呼び出されたときにそれらの値は使用できなくなりますか、それとも自分でこれを行う必要がありますか?この状態データを保存する必要はありませんでしたか?

これについての洞察に感謝します。

4

1 に答える 1

9

onDestroyはインスタンスメソッドであり、それが解放する(またはガベージコレクタが解放できるようにする)メモリは、対応するインスタンスのものになります。アクティビティはシングルトンではありません。アクティビティのインスタンスは複数存在する可能性があります。

静的変数はクラス変数であり、そのクラスのすべてのインスタンスにアクセスできます。これらは、クラスの各インスタンスが作成されるときではなく、クラスがロードされるときに初期化されます。

詳細については、インスタンスとクラスのメンバーについてを参照してください。抜粋:

すべてのオブジェクトに共通の変数が必要な場合があります。これは、静的修飾子を使用して実行されます。宣言に静的修飾子が含まれているフィールドは、静的フィールドまたはクラス変数と呼ばれます。それらは、オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の1つの固定された場所にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。

于 2010-12-16T14:56:54.953 に答える