おすすめ書籍はじめにこんにちは、matsunariです。今回はHanderクラスについて勉強しましたのでまとめたいと思います。アプリでスレッド処理を行いたい場合、注意が必要なのが別のスレッドから直接アプリのUIに関する操作を行うことはできません。このような制限があるのでしょうか?例えば、メインスレッドでないスレッドが並列で実行されているときに、メインスレッドとそれ以外のスレッドが同時に同じテキストビューにsetText()を試みる場合です。このような場合、2つのうちどちらのスレッドのsetText()が適用されるかは予測できず、ユーザは2つのうち1つの値しか見ることができません。このように2つ以上のスレッドを使用する際の同期問題を解消するためにLooperとHandlerを使います。Exceptionというエラーが発生します。)Handlerクラスの基本Handlerクラスを使う前にどのような仕組みで動作しているのか確認してみましょう。いうオブジェクトを持っています。その中にMessageQueueを含んでいます。MessageQueueとはコレクションフレームワークのQueueの一種のことです。Outの性質があります)。LooperはMessageやRunnableオブジェクトを順番に取り出しHandlerが処理するように伝えます。Messageはスレッド間通信する内容を盛り込んだオブジェクトのことです。HandlerはLooperから受けたMessageを実行、処理したり、Looperの持つMessageQueueに送信するための装置のようなものだと考えると良いでしょう。Handlerを使ってsetText()を実行してみる実際にHandlerを使ったサンプルを確認してみましょう。//Handlerのpostメソッドを使用する。tv.setText("Handlerを使って別スレッドからsetText()を行うことに成功しました。{//Handlerのpostメソッドを使用する。{tv.setText("Handlerを使って別スレッドからsetText()を行うことに成功しました。");}});}}).start();}});layout.addView(button);}}このサンプルを実行すると次のような結果を得ることができます。重要なポイントは、post()メソッドはhandlerインスタンスを生成したスレッドにrunnableオブジェクトを送るというところです。今回のケースでは、メインスレッドでhandlerインスタンスが生成されているためメインスレッドのUIは問題なく変化しました。これを別スレッドで行なったとしても効果はありません。実行するスレッドに注意が必要です。sendMessage()を実行してみる今度は冒頭にも少し説明したMessageオブジェクトを使ったサンプルを見てみましょう。"obj";handler.sendMessage(msg);}}).start();}});}}上記サンプルコードではsendMessageメソッドを使用しています。sendMessageメソッドを使うことで、引数にMessageオブジェクトを指定して、情報をhandleMessageメソッドに渡す事ができます。Messageクラスのプロパティに関しては以下の通りです。whatメッセージの識別子として使う事を目的とした、ユーザが勝手に定義して使う事のできる値のこと。arg2whatの他に、arg1とarg2に指定した2つの整数値を渡す事ができる。objオブジェクトを渡したい場合は、この変数に代入する事ができる。サンプルコードを実行するとこのような結果になりました。出力したログさいごに今回は前回投稿のスレッドに続いてHandlerについてまとめてみました。Handler自体の役割は比較的理解しやすい感じはありましたが、仕組みまで覗いてみると深い内容だったので調べ甲斐がありました。この他にもスレッドに関係する機能について深掘りを進めていきたいと思っています。コメントをキャンセルメールアドレスが公開されることはありません。コメント名前メールアドレスサイト上に表示された文字を入力してください。...[Kotlin]DatePickerDialogとTimePickerDialogを使って見た。ChartsライブラリとCryptowatchAPIでローソク足を描画してみる。私たちは無料アプリもリリースしています、ぜひご覧ください。下記のアイコンから無料でダウンロードできます。