Androidアプリを2回目以上実行する問題
質問
私はAndroidを初めて使用し、Andengine(www.andengine.org)に基づいた小さなゲームを開発しています。
このゲームには、さまざまな種類のタイル(可動、いくつかの回転可能)がある背景用のタイル張りのマップが表示されます。また、画面にいくつかの線を描きます。
問題は、ゲームが初めて実行されると(電話で実行され、Eclipseから開始)、完璧に実行されますが、電話のバックボタンを使用してゲームを終了し、電話ホーム画面アイコンからゲームを再起動すると、アプリケーションは非常にバギーです。画面に行が表示されなくなり、移動および回転タイルの機能は一度だけ機能しますが、ゲームは非運用です。クラッシュしませんが、ゲームの再起動によって引き起こされるバグにより、役に立たなくなります。
アプリケーションのライフサイクルで見つけられるすべてを読み、ondestroy()メソッドでさまざまなオブジェクトをnullに設定しようとしましたが、私がしていることは何も違いを生みませんでした。最初のアプリの実行から何かが明らかに「ぶらぶら」され、2回目の開始時に問題が発生します。 24時間のグーグルと私の脳のwrackを助けてください。
ありがとう、スティーブ
PSエミュレータで実行したときの同じ動作。
アップデート:
コードをさらに調査しました。
上記の問題の一部を調査するための小さなプログラムを作成し、ラインを引き出しましたが、アプリの再実行には描かれていません。
Andengineを使用すると、onloadscene()をオーバーライドする必要があります。この方法では、起動時に画面上で必要なものを指定すると、メソッドはシーンオブジェクトを返します。シーンは画面上で見られるものを処理するので、言いたい場合は、画面に新しいライン(またはスプライトなど)を追加して、myscene.addentity(myline)を呼び出します。メインアクティビティクラスと、ラインを描くMylineというクラスを作成しました。
私の主な活動:
public class LineTest extends BaseGameActivity {
@Override
public Scene onLoadScene() {
scene = new Scene(1);
myLine = new MyLine();
myLine.displayLine();
return scene;
}
}
Mylineクラス:
public class MyLine {
static final Scene SCENE = LineTest.scene;
static final int LINE_WIDTH = 4;
Line line = new Line(0,0,0,0);
public MyLine() {
}
public void displayLine() {
line.setLineWidth(4);
line.setColor(1f, 0f, 0f);
line.setPosition(10, 10, 400, 400);
SCENE.getBottomLayer().addEntity(line);
}
public void removeLine() {
SCENE.getBottomLayer().removeEntity(line);
}
}
上記の問題に気付くかもしれません。私の弁護では、私はJavaとOOPに慣れていません。私のアクティビティは1つのシーンのみを使用しているので、Mylineクラス内では、変化しないため、シーンを静的な決勝として宣言できると思いました。間違い!プログラムのデバッグ私は、プログラムが停止した後(バックキーを使用)して再起動した後でも、一度設定された静的な最終シーンが変更されないことを発見しました。ただし、プログラムがコードシーン=新しいシーン(1)を再起動すると、新しいIDを備えた新しいシーンを作成するため、静的な最終シーンは新しいシーンではなく古いシーンを指します。したがって、新しいシーンには行が作成されません。
これを解決するために2つのオプションが機能することがわかりました。
また:
Scene SCENE = LineTest.scene;
または:
static Scene SCENE;
そしてコンストラクターで:
SCENE = LineTest.scene; //I could also pass scene as param to
constructor which may be better OOP practice.
私のゲームアプリケーションに関する他の問題はすべて、物事を静的または静的な最終的なものとして宣言することに関連していると思われます。
どの型変数(および方法)があるべきかを決定するときに使用できる経験則はありますか?
更新:ゲームクラスには、静的な最終的なものとして宣言された3つの変数がありました。それらを静的に変更し、コンストラクターに割り当てることで、すべての問題が解決されました。 {:-)
解決
インスタンスに固有の場合、クラスに静的フィールドがあるのはなぜですか?インスタンス変数などにします。
アプリケーションが開かれたときにすべての静的フィールドを手動でリセットすることもできますが、それは 非常に ぶさいくな。
他のヒント
最初のアプリの実行から何かが明らかに「ぶらぶら」され、2回目の開始時に問題が発生します。
独自のアプリケーションサブクラスを作成しましたか?アプリケーションレベルでゲームの初期化を行い、アクティビティレベルで他の初期化を行っている場合、アプリ自体が殺され再起動されるまで、前者は繰り返されません。バックボタンを使用して終了するだけでは、アプリを直接殺しません。
静的な最終変数の使用には注意してください!!!上記の私の問題の解決策。
私もこの問題に出会い、いくつかの静的変数と静的方法を削除して解決します。 Androidのバックボタンをクリックすると、静的変数がメモリにとどまることはわかっていますが、なぜ効果がそんなに奇妙なのかはまだわかりません。また、上記のみんなに感謝します!