276 views
この記事は最終更新から 569日 が経過しています。
1. やりたいこと
スレッドに対してメッセージ通知したい。
具体的には Handler#sendMessage を使ってパラメーターを渡したい。
2. やってみる
(1) 実装手順
メッセージ受信処理 を書く。
private final Handler hMailBox = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(@NonNull Message msg) { // TODO : ここにメッセージ受信処理を書く。 } };
メッセージ送信処理 を書く。
Message msg = new Message(); // TODO : msgに渡したい情報を格納する。 hMailBox.sendMessage(msg);
(2) サンプルプログラム
処理内容は以下の通り。
(1) サブスレッドを起動し、10秒間待つ。
(2) 10秒経過後、サブスレッドからメインスレッドに sendMessage でパラメーターを渡す。
package com.example.testsendmessage; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; public class MainActivity extends AppCompatActivity { private final Handler hMainThread = new Handler(); // メッセージハンドラ private final Handler hMailBox = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(@NonNull Message msg) { System.out.println("EXEC: handleMessage"); int arg_what = msg.what; int arg_1 = msg.arg1; int arg_2 = msg.arg2; MyParam arg_o = (MyParam)msg.obj; System.out.println("arg_what : " + arg_what); System.out.println("arg_1 : " + arg_1); System.out.println("arg_2 : " + arg_2); System.out.println("arg_prm1 : " + arg_o.getPrm1()); System.out.println("arg_prm2 : " + arg_o.getPrm2()); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1秒タイマーハンドラ起動 Thread th = new Thread(runTimer); th.start(); } // 1秒周期処理 private final Runnable runTimer = new Runnable() { @Override public void run() { try { // 10秒間待ち int i; for (i = 1; i <= 10; i++) { System.out.println("EXEC: runTimer " + i); Thread.sleep(1000); } // Main threadにメッセージ送信 MyParam myp = new MyParam("ABC", 123); Message msg = new Message(); msg.what = 1; msg.arg1 = 2; msg.arg2 = 3; msg.obj = myp; hMailBox.sendMessage(msg); } catch(InterruptedException e){ e.printStackTrace(); } } }; }
sendMessageの引数 msgの objフィールドに埋め込んだ MyParamは以下の通り。
ただのクラスだ。
public class MyParam { private String prm1; private int prm2; public MyParam(String prm1, int prm2){ this.prm1 = prm1; this.prm2 = prm2; } public String getPrm1(){ return this.prm1; } public int getPrm2(){ return this.prm2; } }