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を使うことが多いのだと思う。

関係性
スレッド <-> ルーパー <-> ハンドラー

  1. メインスレッドはデフォルトでルーパーを持つ。他のスレッドもルーパー設定可能。
  2. ハンドラーはnewするときにルーパーを指定する。
  3. ルーパーはque。
  4. queにjobを追加するのはハンドラー。
  5. スレッドとルーパは1対1、しかしルーパとハンドラーは1対多。

用例
なぜかHandlerThread を継承してクラス作ってる例がほとんどない。
そして、HandlerにhandleMessage()書くのが気持ち悪い。
handleMessage()がスレッドに所属するなら違和感ないのだけど、なぜHandlerに?と思う。
Handlerがスレッドに包含されてるなら分かるんだけど、そうじゃないよね。よくわからん。
下記の例はスレッド内にHandlerを内包させたパターン。
複数ハンドラーからqueにタスク追加することを考えると、これはこれで微妙な気がする。

クラスの書き方

  1. public class testHandlerThread extends HandlerThread {
  2. public Handler handler;
  3. public testHandlerThread(String name) {
  4. super(name);
  5. }
  6. @Override
  7. public void onLooperPrepared() {
  8. handler = new Handler(getLooper()) {
  9. @Override
  10. public void handleMessage(Message msg) {
  11. Log.d("testHandlerThread",msg.obj.toString());
  12. }
  13. };
  14. }
  15. }

クラスの利用例

  1. final testHandlerThread handlerThread = new testHandlerThread("other_thread");
  2. handlerThread.start();
  3. handlerThread.onLooperPrepared();
  4. Message msg = Message.obtain();
  5. msg.obj = new String("hoge");
  6. 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-it

Understanding Android Core: Looper, Handler, and HandlerThread
https://blog.mindorks.com/android-core-looper-handler-and-handlerthread-bd54d69fe91a

次はIntentServiceについて書いてみようかと思う。

Written with StackEdit.

コメント

このブログの人気の投稿

ロワシーバスでオペラまで行った後、タクシー乗るのはここがお勧め!

おすすめのシステム手帳!ダヴィンチのロロマクラシックは高品質!!

日本語と中国語の両方を上手く表示できるフォント探し