아래는 코모스튜디오가 직접 만든 무료 앱이에요(한 번만 봐주세요 ^^)
일정, 특정 시간 후에 어떤 작업을 해야 할 경우 아래와 같이 타이머를 쓸 수 있다. 하지만 이렇게 사용할 경우
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
' [안드로이드 공부] > 동기화' 카테고리의 다른 글
비동기 작업은 아버지가 살아있을 때 해라! (0) | 2015.10.05 |
---|---|
당신은 반드시 아이의 부모를 먼저 제거 해야 합니다? (0) | 2015.10.05 |
백그라운드 리소스를 비 동기 태스크에서 사용하기 (0) | 2015.10.05 |
스레드 엄마의 심폐 소생술에... 로이드가 (0) | 2015.10.05 |
스레드(Thread) 대신 AsyncTask(비동기 태스크)를 쓰자! (0) | 2015.08.29 |
모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다. |
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요. |