안드로이드 앱 개발기 4
Filesave를 위한 FSM정의
어제의 삽질을 시작으로 Gap과 Flush의 데이터를 file로 저장하는 state를 구현했다. fsm은 아래 그림이다.
오른쪽 그림을 확대하면 다음과 같다.
stateSave
stateDecision에서 save 버튼을 누르면 stateSave로 들어가기로 했다. stateSave의 초기 상태는 stateSaveDecision이다.
stateSaveDecision
JAVA에서 바로 스테이트를 사용하기 위해, 좀 어색하지만 영문으로 사용하기로 했다. 이 상태는 하는런 작업을 하지 않는다. 데이터가 비어있는지 아닌지를 판단할 때까지 대기한다. data가 없으면 stateStandby로 아무런 작업없이 간다. data가 있으면 stateSveWrite 상태로 움직인다. 데이터가 비어있는지 아닌지는 외부 이벤트로 처리하지 않았다. 전에도 그랬듯이 외부 이벤트 처리를 하면, 한 개의 이벤트로만 잡혀, 아무런 작업이 되질 않는다.
stateSaveWrite
이 state는 데이터를 file로 저장한다. 내부 저장소에 파일을 만들 수 없어, 외부 저장소에 디렉토리를 만들고 파일을 만들었다. 파일명에 날자를 넣고 싶은데, stack overflow에서 찾아 아래와 같이 했다.
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date now = new Date(); String timestamp = dateFormat.format(now)+".txt";
파일을 만든 다음에 루프를 10번 돌려 ,로 분리하여 기록했다.
try { outputStream = new FileOutputStream(filename); for(i=0;i<10;i++) { outputStream.write("SEQ,".getBytes()); outputStream.write("Gap,".getBytes()); tmp = myGapFlush.getData(false,i); outputStream.write(tmp.getBytes()); outputStream.write(",".getBytes()); outputStream.write("Flush,".getBytes()); tmp = myGapFlush.getData(true,i); outputStream.write(tmp.getBytes()); outputStream.write("\n".getBytes()); } outputStream.close(); } catch (Exception e) { e.printStackTrace(); } fsm.dispatchEvent(new Event(fsm, myGapFlush, 8));
파일의 맨 위에 항목을 넣고 싶은데, 복잡하게 될것 같아 그냥 두기로 했다.
이 상태로 들어가면 — enter() 실행시 — 파일로 저장을 한다. file을 만들고 저장하는 부분은 mainActivity에서 한다. fsm에서 할 수 있도록 핸들러로 처리했다. 파일 저장을 하던 못하던 외부 이벤트를 발생하여 stateStandby로 가도록 했다.
stateSaveWrite에서 stateStandby로 전이가 일어날 경우, data의 내용을 초기화한다.