2011-07-19 23 views
0

我正在使用这些教程在使用这些教程的反对谷物http://obviam.net/index.php/table-of-contents/的Android游戏上工作,我的程序突然决定每当我触摸屏幕时发生ANR Key Dispatching Timed Out错误。Android游戏编程,SurfaceView输入事件上的KeyDispatchingTimedOut错误

基本上我有一个MainMenuThread类,它扩展了主线游戏循环的线程,只需在我的MainMenuPanel中调用更新和渲染函数,它可以扩展SurfaceView并处理实际的游戏。

我加载了一堆方形按钮的图像,从屏幕顶部到底部,然后显示4个其他图像,这些图像是按钮并闪烁屏幕(简单的lerp和调用canvas .drawARGB)。一旦完成,当用户按下其中一个方格作为背景时,它会变成被按下的正方形的图像,这确实起作用。起初,我在一些代码中入侵了触摸事件循环遍历每个背景中的每个方块,检查事件坐标是否在其上并作出相应反应,现在我已经将其更改为更精简,但出于某种原因,我一直在一次KeyDispatchingTimedOut每次我触摸屏幕。

我在我的四核心机器上运行这个模拟它一切都很好(在流线之前)我现在正在研究我的上网本,它甚至无法运行android虚拟设备,所以我正在调试我的手机(HTC Hero)。

我搜索周围的答案,发现有人说这可能是因为它做了太多的工作,所以我停止绘制正方形背景,并在每个触摸事件上向logcat输出消息,但我仍然遇到同样的问题,我也尝试在每个触摸事件上启动一个新线程,为我处理这个事件,但没有解决它。我在谷歌搜索中看到的唯一另外一件事是人们说,如果表面不再存在,那么android可以吐出这个错误,但它几乎可以肯定。

我能想到要说的唯一的另一件事是,它甚至没有进入我的逻辑,我的代码是:

if(event.getAction() == MotionEvent.ACTION_DOWN) 
{ 
    Log.d(TAG, "Touch event registered"); 

    int x = (int)event.getX()/squareSize; 
    int y = (int)(getHeight() - event.getY())/squareSize; 

    squares[x][y].setTouched(true); 
} 

和“触摸事件注册”的消息是从来没有输出。

预先感谢能够提供,并且这是我的第一个问题就在这里,我希望这不是太长篇大论/无关的任何帮助。

+0

尝试把一个else语句你贴,看看触摸事件被记录在所有的代码段后。 –

回答

1

事实证明,我的电话是错误> :(

0

我知道这是晚了,但还是:

两件事: 1 - 不要分配x和触摸事件ÿ整数;因为现在我认为你在每个触摸事件上都会创建两个新的整数(每秒可能发生60到80次);不是很好为您的垃圾收集:)

2添加了一个“返回false;”在event.down块的结尾处。这告诉系统你已经看到了触摸事件,但有兴趣继续触摸,所以它会更进一步,并给你event.move的等。 如果你返回true,系统会认为你已经处理了触摸事件和对该事件后的任何其他数据不感兴趣,因此它结束该动作并开始新的动作。

+0

感谢您的答复队友,我很久以前就应该关闭它,我发现问题在于我的手机有问题,或者应该说,我使用的自定义ROM使得手机上的运行和调试应用程序本身不可能,重置为HTC的官方固件,直到触摸屏崩溃! – user852713