7

私はAndroidでグラフィックを描くようになりました。世の中にはたくさんのサンプル アプリケーションがありますが、私がいつも見ているのは lockCanvas です。私は本当にそれを理解していないので、誰かがそれをより詳しく説明できますか?また、将来のプログラミングを理解することが重要だと思うので?

例:

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

これは私が今持っているものです。これを正しく解釈するにはどうすればよいでしょうか。同期は何をしますか? キャンバス オブジェクトを getHolder と lockCanvas に割り当てることが重要なのはなぜですか?

この部分も紛らわしいです:

panel_thread.getHolder().unlockCanvasAndPost(c);

なぜこれが必要なのですか?もっと詳しい説明が本当に必要です。:)

4

1 に答える 1

13

synchronized一度に 1 つのスレッドのみがそのコード ブロックを実行できることを示します。

この例では、synchronizedブロックがないと、複数のスレッドが同時にグラフィックスを描画する可能性があり、結果が乱雑になる可能性があります。したがって、synchronized一度に描画できるスレッドは 1 つだけです。

lockCanvas()書き込むサーフェス領域を作成します。それが呼び出される理由lockCanvas()は、あなたが呼び出すまで、コードが完了するまでunlockCanvasAndPost()他のコードを呼び出して表面に書き込むことができないためです。lockCanvas()

一般に、特にマルチスレッド プログラミングに関連する場合は、ロックを理解することが重要です。ロックは、複数のスレッドによるリソース/コードへの同時アクセスを防ぐために使用される同期プリミティブです。物理的なロックのように動作するため、この名前が付けられました。通常、1 つのスレッドがロックを取得でき、そのスレッドがロックを解放するまで、他のスレッドはロックを取得できません。ロックを使用する際の潜在的な落とし穴の 1 つは、ロックを誤って使用すると、スレッドがロックを待機したままになり、決して解放されない「デッドロック」の状況につながる可能性があることです。

于 2010-07-23T20:42:25.220 に答える