안드로이드 앱 개발기 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형식으로 이벤트를 새로 정의해서 보내는 경우가 대다수다.