[안드로이드 공부]/동기화

스레드, 타이머, 핸들러 그리고 루퍼

코코모아 2015. 8. 30. 15:24

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 

일정, 특정 시간 후에 어떤 작업을 해야 할 경우 아래와 같이 타이머를 쓸 수 있다. 하지만 이렇게 사용할 경우 
TimerTask is scheduled already 에러를 만나 앱을 죽일 수 있다.


이 경우에는 아래와 같은 방법으로 에러를 피할 수 있다.


처음 타이머가 스케줄에 들어가고 난 뒤에 이러저러한 조건에 의해 다시 타이머를 돌려야 하는데 아직 이전에 설정한 타이머가 살아 있기 때문에 죽어 버렸던 것이다. 위 처럼 클래스를 만들어서 관리하게 하면 TimerTask is scheduled already 는 피할 수 있다.
 
하지만 타이머를 많이 쓰게 되면 즉, 극한테스트를 주면 아래와 같은 문자를 토해내면서 죽어 버린다.

java.lang.OutOfMemoryError: pthread_create (stack size 16384 bytes) failed: Try again


즉, 타이머는 기본적으로 좋은놈이 아니란 거다. 그럼 타이머를 안쓰고 어떻게 해결 할 수 있을까?



위와 같이 핸들러를 사용하면 메모리 문제를 해결 할 수 있다. 하지만 또 하나의 시련이 있으니, 위 코드를 그대로 사용할 경우 아래와 같은 에러와 면상을 마주하게 될 것이다.

Can't create handler inside thread that has not called Looper.prepare()


루퍼를 얻지 못해서 생기는 에러다. 아래와 같이 핸들러를 생성할 때 루퍼를 갖다줘야, 다음 일을 꺼내올 수 있게 되어 정상적으로 작동 할 수 있게 된다.

        mStopHandler = new Handler(Looper.getMainLooper());


출처: http://stackoverflow.com/questions/5217350/reschedule-timer-in-android
http://stackoverflow.com/questions/25280016/outofmemoryerror-by-using-java-util-timer



모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.