Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何修复此触摸事件/绘制循环“死锁”?_Android_Synchronization - Fatal编程技术网

Android 如何修复此触摸事件/绘制循环“死锁”?

Android 如何修复此触摸事件/绘制循环“死锁”?,android,synchronization,Android,Synchronization,首先,我想说这是一个很棒的网站,希望你们能帮上忙 我尝试使用LunarLander中的结构创建一个简单的游戏,用户可以在屏幕上拖动一些位图。实际的游戏更复杂,但这并不重要。我撕下了LanderLander中不相关的部分,并建立了自己的位图绘图,比如 BoardThread (an inner class of BoardView): run() { while(mRun) { canvas = lockSurfaceHolder... syncronized(mSurfa

首先,我想说这是一个很棒的网站,希望你们能帮上忙

我尝试使用LunarLander中的结构创建一个简单的游戏,用户可以在屏幕上拖动一些位图。实际的游戏更复杂,但这并不重要。我撕下了LanderLander中不相关的部分,并建立了自己的位图绘图,比如

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。充分讨论