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

时间:2017-03-16 18:15:20

标签: java android events button runnable

当使用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线程被扯到...?

提前致谢。

3 个答案:

答案 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) {