(42) SendMessageでスレッドにパラメーターを渡す。

投稿者: | 2023年3月14日

248 views

この記事は最終更新から 433日 が経過しています。

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;
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)