gpt4 book ai didi

android - 从 OpenGL 线程使用时 Handler.dispatchMessage 挂起/崩溃

转载 作者:行者123 更新时间:2023-11-29 21:59:22 34 4
gpt4 key购买 nike

我正在为 Android 开发一款 opengl 游戏。当用户松开游戏时应该返回主菜单,但是这个调用是从 OpenGl ES 线程到 UI 线程完成的,有一些麻烦。我找到了这篇文章 Pass variables between renderer and another class with 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.


}
}

然后在 OpenGL ES 代码中

gameOverHandler.dispatchMessage(Message.obtain(gameOverHandler));

但我仍然遇到卡住或运行时异常(请参阅上面代码中的注释行)。我在这里遗漏了什么或做错了什么?

顺便说一句,如何获取在 XML 中定义的 View 实例的引用(参见上面代码中的 menuViewID),或者为什么 findViewById 方法返回NULL?

最佳答案

您不想使用 dispatchMessage(msg) 方法。这显然与直接调用 Handler 相同。 (文档很差,好像是给系统用的)。

在这里查看类似的问题:

The difference between Handler.dispatchMessage(msg) and Handler.sendMessage(msg)

相反,你可以使用这个:

gameOverHandler.obtainMessage(MY_MSG_INT_ID).sendToTarget();

关于android - 从 OpenGL 线程使用时 Handler.dispatchMessage 挂起/崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12359989/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com