コントロール更新InvalidateとpostInvalidateの違い


http://shazhuzhu1.iteye.com/blog/971193
Androidでviewの更新を実現するには2つの方法があり、1つはinvalidateであり、もう1つはpostInvalidateであり、前者はUIスレッド自身で使用され、後者は非UIスレッドで使用される.
    AndroidはInvalidate方法を提供してインタフェースリフレッシュを実現していますが、Invalidateは直接スレッド内で呼び出すことができません.彼はシングルスレッドモデルに違反しています.Android UIはスレッドセキュリティではなく、UIスレッド内で起動しなければなりません.
Androidプログラムで使用できるインタフェース更新方法は、HandlerとpostInvalidate()を利用して、現在のスレッドの中でインタフェースを更新する方法の2つがあります.
1,invalidate()を利用して画面を更新する
Handlerオブジェクトを実装し、Handler Messageメソッドを書き換え、invalidate()を呼び出してインターフェースリフレッシュを実現します.スレッド内でインターフェース更新メッセージをsendMessageで送信します.

//  onCreate()     

	new Thread(new GameThread()).start();、

	//      handler

	Handler myHandler = new Handler() {
		//         
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case Activity01.REFRESH:
				mGameView.invalidate(); //     
				break;
			}
			
			super.handleMessage(msg);
		}
	};

	class GameThread implements Runnable {
		public void run() {
			while (!Thread.currentThread().isInterrupted()) {
				Message message = new Message();
				message.what = Activity01.REFRESH;
				//     
				Activity01.this.myHandler.sendMessage(message);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					Thread.currentThread().interrupt();
				}
			}
		}
	}
2,postInvalidate()を使って画面を更新します.
    PostInvalidateを使うのは簡単です.handlerはいらないです.直接スレッドの中でpostInvalidateを呼び出すだけでいいです.

class GameThread implements Runnable {   
        public void run() {   
            while (!Thread.currentThread().isInterrupted()) {   
                try {   
                    Thread.sleep(100);   
                } catch (InterruptedException e) {   
                    Thread.currentThread().interrupt();   
                }   
  
                //   postInvalidate               
                mGameView.postInvalidate();   
            }   
        }   
    }