Android 如何修复此触摸事件/绘制循环“死锁”?
首先,我想说这是一个很棒的网站,希望你们能帮上忙 我尝试使用LunarLander中的结构创建一个简单的游戏,用户可以在屏幕上拖动一些位图。实际的游戏更复杂,但这并不重要。我撕下了LanderLander中不相关的部分,并建立了自己的位图绘图,比如Android 如何修复此触摸事件/绘制循环“死锁”?,android,synchronization,Android,Synchronization,首先,我想说这是一个很棒的网站,希望你们能帮上忙 我尝试使用LunarLander中的结构创建一个简单的游戏,用户可以在屏幕上拖动一些位图。实际的游戏更复杂,但这并不重要。我撕下了LanderLander中不相关的部分,并建立了自己的位图绘图,比如 BoardThread (an inner class of BoardView): run() { while(mRun) { canvas = lockSurfaceHolder... syncronized(mSurfa
BoardThread (an inner class of BoardView):
run()
{
while(mRun)
{
canvas = lockSurfaceHolder...
syncronized(mSurfaceHolder)
{
/* drawStuff using member position fields
in BoardView */
}
unlockSurfaceHolder
}
}
In BoardView
handleTouchEvent(MotionEvent e)
{
synchronized(mSurfaceHolder)
{
/* Modify shared member fields in BoardView
so BoardThread can render the bitmaps */
}
}
我的drawStuff只是遍历一些数组并将位图扔到画布上。一切都很好。然后我想开始处理触摸事件,这样当用户按下位图时,它会被选中,当用户取消按下位图时,它会被取消选中,如果在触摸移动事件中选择了位图,位图会被拖动。我通过在BoardView的父级BoardActivity中监听触摸事件并将其传递到BoardView中来完成这项工作。差不多
BoardThread (an inner class of BoardView):
run()
{
while(mRun)
{
canvas = lockSurfaceHolder...
syncronized(mSurfaceHolder)
{
/* drawStuff using member position fields
in BoardView */
}
unlockSurfaceHolder
}
}
In BoardView
handleTouchEvent(MotionEvent e)
{
synchronized(mSurfaceHolder)
{
/* Modify shared member fields in BoardView
so BoardThread can render the bitmaps */
}
}
这也很好。我可以在屏幕上拖动我的瓷砖,没问题
然而,每隔一段时间,当应用程序首次启动,我触发我的第一次触摸事件时,handleTouchEvent就会停止在DDMS中查看的同步线路上执行。在这段时间内,绘图循环处于活动状态,我可以说,因为屏幕上的计时器会发生变化,通常需要几秒钟或更长的时间,一系列触摸事件才会通过管道,一切都会恢复正常
这对我来说并不是死锁,因为draw循环不断地进出其同步块。这不应该允许事件处理线程在mSurfaceHolder上获取锁吗?这是怎么回事?有人对改进我的结构有什么建议吗
其他一些信息。此挂起仅在活动开始后的第一次触摸事件中发生。这包括调用restoreState后的方向更改。此外,我可以在事件处理程序中删除syncronized块中的所有内容,并且它仍然会在syncronized调用时挂起
谢谢 所以来自的Rob Green帮我获得了更多的信息。我最终使用了一个并发队列将触摸事件传递到我的游戏线程,但在调用saveInstanceState时,我仍然有悬而未决的问题,因此我现在在我的游戏线程的while循环的每个迭代的底部调用thread.sleep16。充分讨论