안드로이드 스마트 로봇 개발 정보
(글 수 131)
excute에서 OID Device의 read 함수로 oid값을 읽는 것은 됩니다만
onDeviceDataChanged 에서 values값을 받아서 oid값을 읽는게 잘 안되서 질문을 올려봅니다.
소스입니다.-
package com.example.oidfirst;
import kr.robomation.physical.*;
import org.roboid.robot.*;
import org.smartrobot.android.*;
import android.os.*;
import android.widget.*;
public class MainActivity extends RobotActivity
{
private Device mFrontLEDDevice;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onInitialized(Robot robot)
{
mFrontLEDDevice = robot.findDeviceById(Albert.COMMAND_FRONT_LED);
}
@Override
public void onExecute()
{
}
@Override
public void onDestroy()
{
mFrontLEDDevice.write(0);
super.onDestroy();
}
@Override
public void onDeviceDataChanged(Device device, Object values, long time)
{
int front=-1;
switch(device.getId())
{
case Albert.EVENT_FRONT_OID:
front=((int[])values)[0];
Log.i("OIDREAD",""+front);
if(front!=-1)
{
TextView tx=(TextView)findViewById(R.id.mytext);
tx.setText("FOID:"+front);
mFrontLEDDevice.write(1);
}
break;
}
}
}
최소 1회 oid가 정상적으로 읽히면 불이 켜지고 화면에 oid값이 나와야하는데 안되더군요; 어디 틀린부분이 있는지요;
로그를 보아하니 아예 이벤트가 발생하지 않는 듯 합니다... 왜그럴까요..




onDeviceDataChangedListener는 리스너 함수입니다.
따라서 리스너를 등록해야지만 호출이 되는데요
RobotActivity에 보시면 onInitialized에서
robot.addDeviceDataChangedListener(this); 를 통해 이 리스너를 등록할 거예요.
따라서,
상속받은 MainActivity의 onInitialized에서
public void onInitialized(Robot robot)
{
super.onInitialized(robot);
mFrontLEDDevice = robot.findDeviceById(Albert.COMMAND_FRONT_LED);
}
하시거나 또는
public void onInitialized(Robot robot)
{
robot.addDeviceDataChangedListener(this);
mFrontLEDDevice = robot.findDeviceById(Albert.COMMAND_FRONT_LED);
}
와 같이 직접 등록하시거나
하셔야 합니다.
그리고, onDeviceDataChanged 메소드는 UI 쓰레드와는 다른 쓰레드에서 호출되기 때문에
onDeviceDataChanged 메소드 내에서는 UI 요소를 건드릴 수 없습니다.
메시지를 던져서 처리하시거나 runOnUiThread를 사용하세요.