前回は、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 件のコメント:
コメントを投稿