Handlerについて

Androidまじめに使えるようにしていこうということでメモがてら記録に残していく。

 

Handlerクラスはスレッド間でメッセージを受け渡すための仕組み

UIを管理するメインスレッドでは、内部的にLooper(メッセージキュー:別スレッドからのメッセージを管理して順に処理する)を持っている。

HandlerはLooperに対してメッセージ(以下の参考でいうRunnableオブジェクト)を送信するためのオブジェクト。

Handlerは別スレッドでnewすると上手く動かない。

public class MainActivity extends Activity {
private TextView txt;
  private Handler handler = new Handler();
  // 省略
  Thread t = new Thread(new Runnable() {
    @Override
    publid void run() {
      try {
        // Http通信処理省略
       final String body = EntitiyUtils.toString(res.getEntity(), "UTF-8");
       handler.post(new Runnable() {
    @Override
      public void run() {
           txt.setText(body)
       })
       } else //以下省略

SendMessage

メッセージの種類に応じて処理を分けたい場合はこっちのが良いかも

Messageのwhat, arg1, arg2, objあたりで処理を分岐する。

参考:Message  |  Android Developers

    handler = object: Handler(Looper.getMainLooper()) {
      override fun handleMessage(msg: Message) {
          if (msg.what == 1) {
              contentBinding.result.text = msg.obj.toString()
          }
      }
  }

  val msg = Message.obtain(handler, 1, "message 1") // 本来は通信結果をここに設定
  handler.sendMessage(msg)