2012年1月12日木曜日

イチからつくるADK「AdkLedの作成その5」インナークラスの記述

イチからつくるADK「AdkLedの作成その4」の続きです。
前回は、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メソッドにハンドラを使ってメッセージを起こる事を「メッセージキューイング」と言います。詳しい事は以下のサイトを参考にしてください。
 最後にインナークラスのmHandlerを記述します。
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 件のコメント:

コメントを投稿