My Photo

« Androidアプリ開発メモ050:サービス その6:サービスのプロセス、スレッド | Main | プロテインシェイカーの代わり »

January 10, 2012

Androidアプリ開発メモ051:Handler その2:handleMessage()

Handlerについての以前の記事・関連記事:
Androidアプリ開発メモ018:Handler
Androidアプリ開発メモ033:サービス その5:Messengerを使用したバインドされたサービス

HandlerはスレッドからGUIを操作するためのものということではなく、Messageと組み合わせて使う汎用的なプロセス間通信の仕組みなんだろうか?

以前の記事でHandler#post()を使ってメインスレッドではないスレッドからUIを操作する方法を示したが、handleMessage()とsendMessage()、sendEmptyMessage()を使った方法もある。
sendMessage()、sendEmptyMessage()を呼ぶと、Handlerを作成したスレッドにおいてhandleMessage()で送ったMessageが受信される。
Handlerのコンストラクタで

mQueue = mLooper.mQueue;
という部分があるが、これはコンストラクタを実行しているスレッドのメッセージキューの参照をハンドラに渡している。これによってHandlerからHandlerのコンストラクタを実行したスレッドへメッセージを送れるようになる(記事末の参考ページ3参照)。

android.os.Hanlderクラス
public final boolean sendMessage(Message msg)
現在の時刻の前にすべての保留中のメッセージの後に、メッセージキューの最後にメッセージをプッシュします。送ったメッセージはこのハンドラに結び付けられたスレッドで、handleMessage()で受信されます。

戻り値 メッセージがメッセージキューに置かれた場合true

public final boolean sendEmptyMessage(int what)
whatの値だけを持つMessageを送る。

Messageについての詳細はAndroidアプリ開発メモ033を参照。

コード例
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  
  handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      String text
        = String.format("change text by sendMessage()→handleMessage(). what=%d", msg.what);
      textView1.setText(text);
    }
  };
  
  textView1 = (TextView)findViewById(R.id.textView1);
  
  // postDelayed()を使用する処理の開始ボタン
  button1 = (Button)findViewById(R.id.button1);
  button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      // スレッドの生成
      Thread thread =new Thread() {
        public void run() {
          changeText1("change text by post().");
        }
      };
      thread.start();
    }
  });
  
  // sendMessage()→handleMessage()を使用する処理の開始ボタン
  button2 = (Button)findViewById(R.id.button2);
  button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      // スレッドの生成
      Thread thread = new Thread() {
        public void run() {
          // sendMessage()→handleMessage()でUIを操作する。
          handler.sendEmptyMessage(100);
          
//          //これでもいける。Messengerはプロセス間通信で使うもの?
//          Messenger messenger = new Messenger(handler);
//          Message message = new Message();
//          message.what = 200;
//          try {
//            messenger.send(message);
//          } catch (RemoteException e) {
//            // TODO 自動生成された catch ブロック
//            e.printStackTrace();
//          }
        }
      };
      thread.start();
    }
  });
}

/**
 * {@link Handler#post(Runnable)})でUIを操作する。
 * TextViewに値をセットする。
 * 
 * @param text TextViewにセットする値
 */
private void changeText1(final String text) {
  handler.post(new Runnable() {
    @Override
    public void run() {
      textView1.setText(text);
    }
  });
}

参考ページ:
1.HandlerとMessage - 別スレッドでのGUI操作 - 愚鈍人
2.GPソフト Wiki - AndroidのHandlerとLooper
3.Handlerクラスの正しい使い方(Androidでスレッド間通信) - ちくたく
4.throw Life - AndroidのHandlerとは何か?

« Androidアプリ開発メモ050:サービス その6:サービスのプロセス、スレッド | Main | プロテインシェイカーの代わり »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/53706643

Listed below are links to weblogs that reference Androidアプリ開発メモ051:Handler その2:handleMessage():

« Androidアプリ開発メモ050:サービス その6:サービスのプロセス、スレッド | Main | プロテインシェイカーの代わり »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof