当使用Java / Android时,我应该在使用像queueEvent(new Runnable(){blah blah blah}这样的东西时处理多个快按按钮?当我快速点击按钮时,第二个事件在第一个事件发生前触发完成并搞砸了。如何隔离它们并一次处理一个?目前我在UI线程中...
public void passOnButtonPress(final int buttonId) {
queueEvent(new Runnable() {
public void run() {
mRenderer.handleInteraction(buttonId);
}});
}
...并且在工作线程......
public void handleInteraction(final int buttonId){
int command = BlockZOpenGl20.getCommand();
switch(buttonId)
{
case R.id.rotateYminus: rotateYMinus
我正在使用runnable,因为我正在创建一个3D游戏并使用OpenGL ES 2进行扩展......
类MyGLSurfaceView扩展了GLSurfaceView {
并实现渲染器......
公共类MyGLRenderer实现GLSurfaceView.Renderer
我已经读过这些应该在他们自己的线程上,但这是游戏逻辑所以按钮按下UI线程被扯到...?
提前致谢。
答案 0 :(得分:1)
第一个事件到达第一个事件后不能成为glSurfaceview的错误。如果你查看文档,你会看到" queueEvent"将同步块中的事件添加到arraylist,稍后从中检索事件。
此代码也有效。请注意,每次更新触摸位置时,都会向队列中添加一个新事件,事件永远不会交换。
@Override
public boolean onTouch(View v, MotionEvent event) {
...
// Calculate normalized value and everything
...
glSurfaceView.queueEvent(new Runnable() {
@Override
public void run() {
mainRenderer.handleOnTouch(action, normalizedX, normalizedY);
}
});
}
另外,为了清楚起见,我建议您将渲染器与glSurfaceView分开。
TLDR:
您的问题是由此行引起的:
int command = BlockZOpenGl20.getCommand();
你可能会改变订单。
答案 1 :(得分:0)
在Android上处理多个queueEvent / Runnable按钮?
您不需要使用新的Runnable(),只需在UI线程中接收按钮调用,它就不会搞砸了。
答案 2 :(得分:0)
我通过解决方法解决了这个问题。我有一个onDrawFrame例程,其中有许多状态由经过的时间量控制......
@Override
public void onDrawFrame(GL10 unused) {
if(frame == Blockz.ANIMATION_FRAME_RATE){
if(animationState == AnimationState.MOVE)
{
do something...
once game logic complete
animationState == AnimationState.NEUTRAL
我设置了一个控制用户输入的例程,因此只有在游戏逻辑处于理解状态时才会运行另一个命令。
public void handleInteraction(final int keyCode){
if(animationState == AnimationState.NEUTRAL) {