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