私はAndroid用のopenglゲームに取り組んでいます。ユーザーがゲームを失うとメインメニューに戻る必要がありますが、この呼び出しはOpenGl ESスレッドからUIスレッドに行われるため、いくつかの問題があります。私はこの投稿を見つけ、queueEvent()を使用してレンダラーと別のクラスの間で変数を渡し、次のコードでHandlerクラスを追加しようとしました。
public class GameActivity extends Activity {
private GLSurfaceView gameView;
private int menuViewID;
private Handler gameOverHandler;
public GameActivity () {
super();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gameOverHandler = new Handler() {
public void handleMessage (Message msg){
handleGameOver();
}
};
gameView = new GameView(this, gameOverHandler);
menuViewID = R.layout.main;
setContentView(menuViewID);
}
/** Called when the user selects the Send button */
public void startGame(View view) {
setContentView(gameView);
gameView.setVisibility(View.VISIBLE);
}
private void handleGameOver() {
/**
* TODO: switch back to main menu
*/
// setContentView(menuViewID); // after this gameView freezes
// gameView.setVisibility(View.GONE); // after this application throw an error: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
}
}
その後、OpenGLESコードで
gameOverHandler.dispatchMessage(Message.obtain(gameOverHandler));
しかし、まだフリーズまたはランタイム例外が発生しています(上記のコードのコメント行を参照してください)。私がここで見逃していること、または間違っていることは何ですか?
ちなみに、XMLで定義されたViewインスタンスの参照を取得する方法(menuViewID
上記のコードを参照)、またはfindViewById
メソッドが返す理由はNULL
何ですか?