AndroidのHandlerとMessageで他スレッドで処理を行う方法
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);
}
}
スポンサーリンク