2012-05-06 22 views
1

私は自分のSurfaceViewを実装しています。このオブジェクトには、さまざまなグラフィックオブジェクトをCanvasに描画する目的のThreadオブジェクトが含まれています。私のSurfaceViewのコンストラクタでは、描画するオブジェクトを設定し、Threadオブジェクト(現在)はキャンバスにのみ適切な位置に配置します。HandlerThreadはどのようにメッセージを処理しますか?

ユーザが特定のアクション(スレッドオブジェクトが実行されている)を実行した後、SurfaceViewのコンストラクタで作成されたオブジェクトの1つを変更する必要があります(オブジェクトはビットマップです)。これは、アプリケーションのGUIスレッドとスレッドオブジェクトを実行しているスレッドとの間の通信を意味します。私はHandlerThreadクラスの使用方法を詳しく述べたthisページを発見しました。しかし、私はこのクラスがどのようにメモリ一貫性のエラーがないことを保証するために働くかを確認する必要があります。

次は、明確にするために取り除か多い自分のクラスの擬似コードです:

public MyThread extends Thread { 
    boolean _run = true; 
    public void run(){ 

     // Create HandlerThread object 
     // Create Looper object 
     // Create Handler object 
     while (_run){ 
      // DRAW the Bitmap in this loop 
     } 
    } 

    public boolean handleMessage(Message message){ 
     /* 
     ALTER the Bitmap here as required 
     */ 
    } 
} 


public MyThread extends Thread { 
    boolean _run = true; 
    public void run(){ 

     // Create HandlerThread object 
     // Create Looper object 
     // Create Handler object 
     while (_run){ 
      // DRAW the Bitmap in this loop 
     } 
    } 

    public boolean handleMessage(Message message){ 
     /* 
     ALTER the Bitmap here as required 
     */ 
    } 
} 

私はhandleMessage()方法がrun()メソッドを実行する同じスレッドで実行されることを理解しています。しかし、handleMessage()はビットマップを変更するので、run()はビットマップを描画します。スレッドがrun()メソッドに戻る前に、handleMessage()が完全に完了することを確認できますか?

答えて

0

質問が分かりませんか?

どちらの場合も通常のThreadクラスを拡張していますが、本質的に特別なことはしません。異なる呼び出しスレッドからrunhandleMessageを実行するように指定していない限り、シリアル化された方法で実行されます。だから私の推測ははいです。スレッドセーフな実行パターンでなければなりません。同じスレッドでhandleMessagerunを呼び出す場合、同期させてはならない理由はありません。 2つのメソッドを別のスレッドから呼び出す場合(または、他の場所で回答が見つからない場合)、

のように、どちらのメソッドでも synchronized(myLock)を使用して常にオブジェクトモニタをロックすることができます
public MyThread extends Thread { 
    boolean _run = true; 
    public void run(){ 
     synchronized(this) { 
      while (_run){ 
      // DRAW the Bitmap in this loop 
      } 
     } 
    } 

    public boolean handleMessage(Message message){ 
     synchronized(this){...} 
    } 
} 
関連する問題