Androidノート:invalidate()とpostInvalidate()の違いと使い方

http://blog.csdn.net/mars2639/article/details/6650876

Androidには、インターフェイスを更新するためのInvalidateメソッドが用意されていますが、Invalidateはシングルスレッドモデルに違反しているため、スレッドで直接呼び出すことはできません。AndroidUI操作はスレッドセーフではなく、これらの操作はUIスレッドで呼び出す必要があります。 

invalidate()はビューを更新するために使用され、UIスレッドで実行する必要があります。たとえば、ビューの表示を変更する場合は、invalidate()を呼び出して、再描画されたインターフェースを確認します。invalidate()の呼び出しは、メインのUIスレッドキューから古いビューをポップします。Androidプログラムにはデフォルトで1つのプロセスしかありませんが、1つのプロセスに多数のスレッドが存在する場合があります。

非常に多くのスレッドの中で、UIインターフェースの表示、更新、および制御の相互作用を主に担当するスレッドは、UIスレッドと呼ばれます。onCreate()メソッドはUIスレッドによって実行されるため、UIスレッドはメインスレッドとしても理解できます。残りのスレッドは、ワーカースレッドとして理解できます。

invalidate()はUIスレッドでモバイル化する必要があり、UIスレッドはワーカースレッドのハンドラーを介してインターフェイスを更新するよう通知できます。

そしてpostInvalidate()がワーカースレッドで呼び出されます

 

 

invalidate()を使用してインターフェースを更新し

  、Handlerオブジェクトをインスタンス化し、handleMessageメソッドを書き換えてinvalidate()を呼び出してインターフェースの更新を実現します。スレッドでは、インターフェース更新メッセージはsendMessageを介して送信されます。 
// onCreate()でスレッドを開始します

new Thread(new GameThread())。start();

//ハンドラをインスタンス化します

Handler myHandler = new Handler(){ // public void handleMessage(Message msgを受け取った後にメッセージを処理します){ switch(msg.what){ case Activity01.REFRESH:mGameView.invalidate(); //インターフェースを更新します; } super.handleMessage(msg); } }; クラス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(); } } } } postInvalidate()で更新しますインタフェース     postInvalidateを使用してはただのスレッドで直接postInvalidateを呼び出し、ハンドラが必要とされていない、比較的簡単です。 クラスGameThreadはRunnableを実装します{ public void run(){ while(!Thread.currentThread()。isInterrupted()){ try { Thread.sleep(100); } catch(InterruptedException e){ Thread.currentThread()。interrupt() ; } // postInvalidateを使用して、スレッドmGameView.postInvalidate();でインターフェイスを直接更新します} }


























}

おすすめ

転載: blog.csdn.net/kerwinJu/article/details/52885794