안드로이드 앱 개발기 2
FSM 모델 수정
batch 입력에서 에러가 발생하면 초기 상태로 돌아가는데, 그렇게 되면 나중에 데이터를 저장하거나, 초기화 할 경우, 항상 초기 상태에서 전이가 된다. 별로 좋지 않아 보여 아래와 같이 fsm을 수정 했다.

#stateBatchRec에 한번 들어가면 에러가 발생할 경우, #stateDecision 상태로 들어가게 했다. 그 부분에서 #stateSave나 #stateModi로 전이를 일어나게 할 생각이다. 뒤 부분은 아직 못 그렸지만..
보완할 사항으로는 #stateBatchRec 상태에서 일정 시간동안 지나면 #stateDecision으로 돌아가야 한다. timer를 쓰려고 보니, 좀 복잡하여, int를 계속 더해서 일정수가 지나면 전이가 일어나게 하려고 했는데, 잘 안된다. 하위 상태인 #stateRec_Gap에서 int를 초기화 시켜야되는데, 하위 state에서 상위 state에 접근할 수 있는 방법이 없어 보인다.
버튼 두번 입력시 SpeechRecognizer 오류 발생 문데
인식을 시작 하라고 버튼을 누른 상태에서 다시 버튼을 누르면 에러가 발생한다. 이럴 경우, 적당한 초기화를 해야 하는데, 딱히 없어 보인다. #stateDecision에 들어가면 기존의 SpeechRecognizer를 취소하게금 아래와 같이 했다.
State stateDecision = new State(s0) {
@Override
public State fireInit() {
Log.d("FSM", "Init>>stateDecision;");
return null;
}
@Override
public void enter() {
Log.d("FSM", "Entry>>stateDecision;");
myHandle.sendEmptyMessage(2);
}
Main Activity는 아래와 같이 handler 처리를 했다.
public class MainActivity extends AppCompatActivity {
Intent i;
SpeechRecognizer mRecognizer;
int TvIndex = 0;
TextView[] TvGap = new TextView[10];
TextView[] TvFlush = new TextView[10];
//hsm에서 SpeechListener를 제어하기 위해서.
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//음성인식 시작부분..
if (msg.what == 1)
mRecognizer.startListening(i);
if (msg.what == 2)
mRecognizer.cancel();
}
};
thread 사용 문제
주기적으로 이벤트를 감지하기 위해서 thread를 사용했는데, 딱히 필요해 보이지 않는다. 각 이벤트마다 fsm.dispatch형식으로 이벤트를 새로 정의해서 보내는 경우가 대다수다.