686 views
この記事は最終更新から 1005日 が経過しています。
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;
}
}
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2025-12-14: 0回 2025-12-13: 0回 2025-12-12: 0回 2025-12-11: 0回 2025-12-10: 0回 2025-12-09: 0回 2025-12-08: 4回