2010-07-23 76 views
4

我一直在Android中繪製圖形。有很多示例應用程序,但我總是看到一件事是lockCanvas。有人可以更接近地解釋它嗎?因爲我真的不明白它,還因爲我認爲了解未來的編程很重要?lockCanvas是什麼意思(精心製作)

一個例子:

try { 
    c = panel_thread.getHolder().lockCanvas(null); 
    synchronized (panel_thread.getHolder()) { 
     panel_thread.update(); 
     panel_thread.onDraw(c); 
    } 
} 

這是我現在。 我應該如何解釋這個正確的?同步做什麼?爲什麼將canvas對象分配給getHolder和lockCanvas很重要?

這部分也是讓人眼花繚亂:

panel_thread.getHolder().unlockCanvasAndPost(c); 

爲什麼是這個必要嗎?我真的需要更詳細的解釋。 :)

回答

10

​​表示一次只有一個線程可以執行該代碼塊。

在本例中,如果沒有​​塊,多個線程可能會同時繪製圖形,並且結果可能會變得混亂。因此,​​確保一次只能繪製一個線程。

lockCanvas()創建您要寫入的表面區域。它被稱爲lockCanvas()的原因是因爲在調用unlockCanvasAndPost()之前沒有其他代碼可以調用lockCanvas()並寫入表面直到代碼完成。

一般來說,鎖對於理解很重要,特別是當它涉及到多線程編程時。鎖是一種同步原語,用於防止多線程同時訪問資源/代碼。它得到它的名字,因爲它的行爲很像一個物理鎖。通常一個線程可以獲得一個鎖,並且直到它釋放鎖,其他線程才能獲得該鎖。使用鎖的一個潛在的問題是濫用它可能導致「死鎖」情況,在這種情況下,線程正在等待鎖,並且它永遠不會被釋放。

+0

謝謝,我認爲getHolder只是爲我們提供了區域?爲什麼我們用lockCanvas方法發送null? – Curtain 2010-07-23 20:46:00

+0

正確,它將返回表面支架對象。 – Alan 2010-07-23 20:48:47

+0

好的,謝謝。只是有點混淆,我們發送null到lockCanvas? – Curtain 2010-07-23 20:51:01