HandlerThreadで非同期処理

Androidで、メインスレッドとは別にHandlerThreadを立てて、随時そっちにメッセージを投げる。
メッセージはどんどんキューに溜められて行って、古い物から一つづつ処理されていく。
同じHandlerThreadに投げられたメッセージが同時に処理されることはない。


まずはスレッドを立ててみる。フィールドにはこんなのを用意。

private HandlerThread myThread;
private Handler myThreadHandler;

で、どこか適当なところでスレッド開始。

myThread = new HandlerThread("testThread");
myThread.start();
myThreadHandler = new Handler(myThread.getLooper());

あとは好きなだけメッセージを投げる。

myThreadHandler.post(new Runnable() {
 public void run() {
  Log.d("async","processed");
 }
});

アプリが終わる時(Activity.onPause()とか)にはスレッドを終わらせてやる。

myThread.quit();

quit()が呼ばれた瞬間に処理中のメッセージがあった場合、それが終わってからスレッドが終了するっぽい?ので、場合によっては本人にその他の後片付けと合わせて終了処理をさせた方がいいのかも。

myThreadHandler.post(new Runnable() {
 public void run() {
  myThread.quit();
  myThread = null;
 }
});

名前からして安全そうなquitSafely()メソッドもあるけど、これはAPI level18からなので古い端末では使えない。


上のquitメソッドを含むメッセージを投げた後、実際にquitが実行される前にさらに他のメッセージを投げても、普通にpostは成功する。でも実際に処理はされない。そりゃ当然。

一方quitが実行された後、もう終わってるスレッドにメッセージを投げると、logに警告は出るけどアプリが落ちたりはしない模様。これは都合が良いような良くないような。