前回は、MainActivityクラスのスレッド用オーバーライドメソッドであるrunメソッドの記述まで行いました。次に、インナークラスを記述しArduinoとのやりとりをキュー(待ち行列)で実現します。
修正可能なエラーを変更すると、以下の4項目のエラーが残ります。
まずは、上2つのエラーを修正しましょう。
5. インナークラスの記述
2つのエラーの概要は以下の通りです。
LedMsgを型に解決できません。
LedMsgインナークラスが存在していないために起こるエラーです。LedMsgインナークラスLEDの状態を示すプライベートな定数MESSAGE_LEDとLED命令処理用のを記述します。
MESSAGE_LED cannot be resolved to a variable
メッセージLEDの状態をしめす定数MESSAGE_LEDが未定義のために起こるエラーです。
5.1. Runメソッドのブロックの下にソースを記述します。MainActivity.javaのウィンドウを下方向にスクロールし最下行の「}」の一つ上に移動します。
5.2. 以下のJavaソースを記述してください。
private static final int MESSAGE_LED = 1; private class LedMsg { private byte on; public LedMsg(byte on) { this.on = on; } public boolean isOn() { if(on == 0x1) return true; else return false; } }LedMsgから呼び出されるisONメソッドも合わせて記述します。
5.3. ソースを保存すると、以下の2項目のエラーのみになります。
5.4. ダブルクリックしてエラーの行を確認し、runメソッド内でハンドラがメッセージを送っているソースコードを確認してみて下さい(ここは確認のみ)。
mHandlerはハンドラのインスタンス変数です。
スレッド内のrunメソッドにハンドラを使ってメッセージを起こる事を「メッセージキューイング」と言います。詳しい事は以下のサイトを参考にしてください。
- TechBooster ThreadとHandlerでマルチスレッド処理化する
isOnメソッドのブロックの下にソースを記述します。MainActivity.javaのウィンドウを下方向にスクロールし最下行の「}」の一つ上に移動します。
5.5. 以下のJavaソースを記述してください。
// UI スレッドで画面上の表示を変更 private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_LED: LedMsg o = (LedMsg) msg.obj; handleLedMessage(o); break; } } }; private void handleLedMessage(LedMsg l) { if(l.isOn()) { mLedStatusView.setText("ON"); } else { mLedStatusView.setText("OFF"); } }mHandlerの無名コンストラクタ内から呼び出されるhandleLedMessageメソッドも合わせて記述します。
5.6. ソースを保存すれば、Handlerの赤×部分を修正されます。
これで、MainActivity.javaのソースコードはすべて記述されました。
次は、イベントをフィルタするXMLファイルを記述しましょう。
0 件のコメント:
コメントを投稿