HandlerThread - 非同期処理 - Android
Androidの非同期処理
- Androidはシングルスレッド云々
- なので、ユーザー操作を邪魔してだめ
- よって、時間の掛かる処理は必ず別スレッドで処理云々。
ググると何だかいろいろ出てくる。
関連キーワード
Service, IntentService, HandlerThread, looper, handler, thred, AsyncTask, Message, Runnable, RxJava
javaのスレッドの知識はあったんだけど何だか雑雑して理解が出来ない。上記キーワード間の関連が全然分からないので整理した。
ThreadからHandlerThreadへの変遷
まずはThread, Looper, Handler, HandlerThread, Message, Runnableこの変の話。
- シングルスレッドのAndroidではメインスレッドで重い処理してはだめ
- そうだ!スレッド使おう
- 従来のスレッドだと連続利用するのに不便
- 毎回インスタンス作成だとオーバーヘッドかかる
- コールバック処理当の記述も煩雑
- そうだ!スレッドにqueを実装してタスクがくれば処理できるような仕組みにしよう
- Looperの誕生
- スレッドにLooperを追加することで繰り返し利用が可能に
- どうやってスレッドにタスクを渡すの?
- Handlerの誕生
- Handler経由でMessageやRunnableをThreadに渡す
- なんか雑雑してない?もっとエレガントにしない?
- HandlerThreadの誕生
だいたいこういう流れだと思う。実際はHandlerThreadを使うことが多いのだと思う。
関係性
スレッド <-> ルーパー <-> ハンドラー
- メインスレッドはデフォルトでルーパーを持つ。他のスレッドもルーパー設定可能。
- ハンドラーはnewするときにルーパーを指定する。
- ルーパーはque。
- queにjobを追加するのはハンドラー。
- スレッドとルーパは1対1、しかしルーパとハンドラーは1対多。
用例
なぜかHandlerThread を継承してクラス作ってる例がほとんどない。
そして、HandlerにhandleMessage()書くのが気持ち悪い。
handleMessage()がスレッドに所属するなら違和感ないのだけど、なぜHandlerに?と思う。
Handlerがスレッドに包含されてるなら分かるんだけど、そうじゃないよね。よくわからん。
下記の例はスレッド内にHandlerを内包させたパターン。
複数ハンドラーからqueにタスク追加することを考えると、これはこれで微妙な気がする。
クラスの書き方
public class testHandlerThread extends HandlerThread {
public Handler handler;
public testHandlerThread(String name) {
super(name);
}
@Override
public void onLooperPrepared() {
handler = new Handler(getLooper()) {
@Override
public void handleMessage(Message msg) {
Log.d("testHandlerThread",msg.obj.toString());
}
};
}
}
クラスの利用例
final testHandlerThread handlerThread = new testHandlerThread("other_thread");
handlerThread.start();
handlerThread.onLooperPrepared();
Message msg = Message.obtain();
msg.obj = new String("hoge");
handlerThread.handler.sendMessage(msg);
参考
Androidのバックグラウンドを使いこなす Thread, Looper, Handler
https://academy.realm.io/jp/posts/android-thread-looper-handler/android - What is the purpose of Looper and how to use it? - Stack Overflow
https://stackoverflow.com/questions/7597742/what-is-the-purpose-of-looper-and-how-to-use-itUnderstanding Android Core: Looper, Handler, and HandlerThread
https://blog.mindorks.com/android-core-looper-handler-and-handlerthread-bd54d69fe91a
次はIntentServiceについて書いてみようかと思う。
Written with StackEdit.
コメント
コメントを投稿