gpt4 book ai didi

java - 在 Android 上处理多个队列事件/可运行按钮按下?

转载 作者:行者123 更新时间:2023-12-02 13:39:01 25 4
gpt4 key购买 nike

当使用 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 进行扩展...

MyGLSurfaceView 类扩展了 GLSurfaceView {

并实现渲染器...

公共(public)类MyGLRenderer实现GLSurfaceView.Renderer

我读到这些应该在自己的线程上,但这就是游戏逻辑所在,因此 UI 线程上的按钮按下会被卡住......?

提前致谢。

最佳答案

第一个事件之后到达的第二个事件不可能是 glSurfaceview 的错误。如果您查看文档,您会发现“queueEvent”将同步块(synchronized block)中的事件添加到数组列表中,稍后从中检索事件。

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

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

您可能会颠倒顺序。

关于java - 在 Android 上处理多个队列事件/可运行按钮按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42841879/

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