AndroidのHandlerとMessageで他スレッドで処理を行う方法

2019年5月16日

Androidはメインスレッドで重たい処理を行うと、

処理が終了するまで画面が止まってしまいます。

 

これを解決する手段の一つとして、HandlerとMessageを使用します。

 

Androidの描画処理はUIスレッドしか持たないシングルスレッド設計なので、

handlerとThereadを使用して、他のスレッドで処理を行う際によく使用されます。

受信用のメソッドであるhandleMessageをoverrideする

1)Handlerの宣言

Handlerはスレッドを跨いでMessageクラスのオブジェクトを

送受信することができますので覚えておきましょう。

2)受信のメソッドであるhandlerMessageのoverride

送信のメソッドは変更の必要がありませんので、

受信を行うメソッドであるhandlerMessage(Message msg)のみoverrideしましょう。

 

3)処理を行わせるスレッドであるTaskTreadを宣言

TaskTreadにHandlerを渡しておきます。

このHandlerを利用して後にMessageをTaskThreadからメインスレッドに送信します。

 

4)Messageを設定

MesageのインスタンスはMessage.obtain()で取得できます。

newでインスタンスを作ることもできますが、obtain()が推奨されていますので、

そのようにしましょう。



 

 
//1)Handlerの宣言
Handler handler = new Handler() {
    //2)受信のメソッドであるhandlerMessageのoverride
    @override
    public void handleMessage(Message msg) {
        switch(msg.what) {
    case 1:
        // 引数のmsgはObject型なのでキャストする
        Log.d("Handler", (String)msg.obj);
        break;
         default : 
            break;
        }
    }
}
//3)TaskTreadの宣言
class TaskTread extends Thread {
private Handler handler;
public TaskThread(Handler handler) {
this.handler = handler;
}
@override
public void run() {
//重たい処理
// ・・・
                //4)Messageを設定
Message msg = Message.obtain();
msg.what = 1;
// 結果がString型のresultにあると仮定
msg.obj = result;
handler.sendMessage(msg);
}
}