处理 Android 上的多个 queueEvent/Runnable 按钮按下?

Handling multiple queueEvent / Runnable button presses on Android?

当使用 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

我在创建 3D 游戏时使用 runnable,并使用 OpenGL ES 2 扩展...

class MyGLSurfaceView 扩展了 GLSurfaceView {

并实现渲染器...

public class MyGLRenderer 实现 GLSurfaceView.Renderer

我读到这些应该在它们自己的线程上,但这是游戏逻辑所在的地方,所以在 UI 线程上按下按钮会被丢弃...?

提前致谢。

Handling multiple queueEvent / Runnable button presses on Android?

不需要使用new Runnable(),直接在UI线程中接收按钮调用就不会乱了。

第二个事件在第一个事件之后到达不能是 glSurfaceview 的错误。如果您查看文档,您会看到 "queueEvent" 将同步块中的事件添加到数组列表,稍后从中检索事件。

此代码也有效。请注意,每次更新触摸位置时,都会将一个新事件添加到队列中,并且这些事件永远不会交换。

        @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();

你可能颠倒顺序的地方。

我已经通过变通方法解决了这个问题。我有一个 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) {