只是想開始說這看起來像一個偉大的網站,希望你們可以幫忙!我該如何解決這個觸摸事件/繪製循環「死鎖」?
我試圖使用LunarLander中佈局的結構來創建一個簡單的遊戲,用戶可以在屏幕上拖動一些位圖(實際的遊戲更復雜,但並不重要)。我撕掉了LanderLander的不相關部分,併成立了自己的位圖繪製,像
BoardThread (an inner class of BoardView):
run()
{
while(mRun)
{
canvas = lockSurfaceHolder...
syncronized(mSurfaceHolder)
{
/* drawStuff using member position fields
in BoardView */
}
unlockSurfaceHolder
}
}
我drawStuff只是通過一些列散步,拋出位圖到畫布上。所有的工作正常。然後,我想要開始處理觸摸事件,以便在用戶按下位圖時選擇該位圖,當用戶取消位圖時取消選擇該位圖,並且如果在觸摸移動事件中選擇位圖,則位圖將被拖動。我通過在BoardView的父級BoardActivity中偵聽觸摸事件並將它們傳遞到BoardView中來完成這件事。類似於
In BoardView
handleTouchEvent(MotionEvent e)
{
synchronized(mSurfaceHolder)
{
/* Modify shared member fields in BoardView
so BoardThread can render the bitmaps */
}
}
這也適用。我可以在屏幕上拖動我的瓷磚沒問題。
但是,每當偶爾首次啓動應用程序並觸發我的第一個觸摸事件時,handleTouchEvent將停止在同步行處執行(如在DDMS中所看到的那樣)。繪圖循環在這段時間內處於活動狀態(我可以告訴,因爲計時器會在屏幕上變化),並且通常需要幾秒鐘或更長時間才能通過管道傳輸一堆觸摸事件,並且一切都很順利。
對我來說,這看起來並不像死鎖,因爲繪製循環會不停地進出同步塊。不應該讓事件處理線程在mSurfaceHolder上獲取鎖嗎?這裏發生了什麼?任何人都有改善我這種結構的建議嗎?
其他信息。這種「掛起」只發生在活動開始後的第一次觸摸事件上。這包括調用restoreState後的方向更改。另外,我可以在事件處理程序的syncronized塊中刪除EVERYTHING,並且它仍然會掛起同步化的呼叫。
謝謝!