crash - 多次点击会创建索引超出范围的异常

标签 crash multi-touch

我正在改编Mario Zechner的Beginning Android Games框架,以创建一个幼儿色彩学习应用程序。在测试的最后阶段,我发现如果用户同时按下并释放两个不同的按钮(例如下面的屏幕快照中的“设置”和“主页”按钮),“颜色!”就会停止。通知出现。

Zechner的框架以列表的形式提供输入的处理,然后分别处理每个输入。我相信问题出在代码的@Override更新区域:

@Override
public void update(float deltaTime) {
    world.timer = world.timer + deltaTime;

    List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
    int len = touchEvents.size();

    for (int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i);

        if (event.type == TouchEvent.TOUCH_UP) {
            // This is where the guts of my app are
        }
    }
}

以下是来自LogCat的显示异常的信息(我注意到“无效索引”将有所不同,具体取决于使用了多少触摸,但大小始终为0):
04-24 19:27:55.239: E/AndroidRuntime(28002): FATAL EXCEPTION: Thread-555
04-24 19:27:55.239: E/AndroidRuntime(28002): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
04-24 19:27:55.239: E/AndroidRuntime(28002):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
04-24 19:27:55.239: E/AndroidRuntime(28002):    at java.util.ArrayList.get(ArrayList.java:304)
04-24 19:27:55.239: E/AndroidRuntime(28002):    at com.lilyandrosieshow.colors.GameScreen.update(GameScreen.java:153)
04-24 19:27:55.239: E/AndroidRuntime(28002):    at com.badlogic.androidgames.framework.impl.AndroidFastRenderView.run(AndroidFastRenderView.java:42)
04-24 19:27:55.239: E/AndroidRuntime(28002):    at java.lang.Thread.run(Thread.java:856)
04-24 19:28:59.301: D/dalvikvm(28002): GC_CONCURRENT freed 482K, 4% free 15473K/16071K, paused 2ms+2ms
04-24 19:32:55.262: I/Process(28002): Sending signal. PID: 28002 SIG: 9
04-24 19:32:55.262: E/AndroidRuntime(28002): Handle UnCaght exceptions. KILLING PID: 28002

我试图添加
if (len != 0)

在for循环之前,但是收到了相同的结果

谢谢您的协助!

最佳答案

“设置”和“主页”按钮通向另一个Screen实现,并带有诸如game.setScreen(new HomeScreen())的调用。在该方法内部,Screen参数以零增量时间更新。如果参数Screen的update方法还通过从游戏的UserInput实例的事件中获取触摸事件来遍历触摸事件,则当前事件列表不再与在旧Screen中进行迭代的事件列表相同。解决方法是从对setScreen()的任何调用立即返回。无需继续触摸处理。

@Override
public void update(float deltaTime) {
    world.timer = world.timer + deltaTime;

    List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
    int len = touchEvents.size();

    for (int i = 0; i < len; i++) {
        TouchEvent event = touchEvents.get(i);

        if (event.type == TouchEvent.TOUCH_UP) {
            if (touchingHomeButton(event)) {
                game.setScreen(new HomeScreen());
                return; // return immediately
        }
    }
}

关于crash - 多次点击会创建索引超出范围的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204126/

相关文章:

Ios确实收到内存警告和应用程序崩溃

ios - 在模拟器中关闭应用程序后 Xcode 崩溃

ios - iOS 崩溃 > TCCAccessRequest_block_invoke_2.8

iphone - 区分 iPhone 上的 UITouch 对象

iphone - EXC_BAD_ACCESS 当 popViewControllerAnimated 在基于导航的应用程序中时

ios - 使用 Swift SpriteKit 时出现错误 "Thread 1: EXC_BAD_INSTRUCTION (code = EXC_1386_INVOP, subcode = 0x0)"

.net - 适用于 Windows 窗体的 Windows 7 MultiTouch .NET API

actionscript-3 - Flash AS3 多点触摸事件处理程序

objective-c - 两根手指点击 UIButton

android - 多点触控 Android 编程中使用的库和函数列表