2010-05-07 67 views
0

只是想開始說這看起來像一個偉大的網站,希望你們可以幫忙!我該如何解決這個觸摸事件/繪製循環「死鎖」?

我試圖使用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,並且它仍然會掛起同步化的呼叫。

謝謝!

回答

0

So Rob Green rbgrn幫助我瞭解了更多信息。我最終使用了一個併發隊列來將觸摸事件傳遞給我的遊戲線程,但是當saveInstanceState被調用時,我仍然有問題,所以我現在在我的遊戲線程的每個迭代的底部調用Thread.sleep(16)循環。充分討論here