안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요
제가 자바 타이머를 사용합니다.
타이머가 이벤트를 발생했을경우, ui 를 변경하려고 하는데요
ui 업데이트 하는 함수에서 자꾸 멈추더라구요
그렇다고 다운되는것은아니고. 확인을 해보니 ui 업데이트 하는 소스는 들어가는데 단지 화면에 뿌리지만 못하는 것 같아요.
그래서 예외를 찍어봤다니
다음과 같았습니다.
"exception: android.view.viewroot$calledfromwrongthreadexception: only the original thread that created a view hierarchy can touch its views"
내용을 보면 ui를 가지고 있는 쓰레드를 호출하라고 하는것 같은데
제가 만든 프로그램은 따로 스레드를 만들지 않았는데.. 뭘어케 해야하는 지 모르겠네요
타이머를 쓰지 않고 버튼으로 이미지 변경을 하면 잘되는데 버튼으로 맵핑하지 않고 타이머를 쓰면 저 현상이 발생하네요
2009.07.13 16:03:55
(추천:
0 / -1)
자바 타이머는 가급적 사용하지 마시기 바랍니다. 자바 타이머는 내부적으로 별도의 스레드를 만들어 동작하기 때문에 발생하는 현상입니다. 안드로이드 내부에서 타이머 관련 작업에 대해서는 http://www.androidpub.com/4374 이 글을 참고하시기 바랍니다.
2009.07.15 15:25:20
저도 같은 경우가 있어서 Timer와 Handler 두개를 모두 같이 사용해서 해결 하였습니다.
Handler에서 Timer처럼 지정된 Interval 마다 실행되게 하는 방법을 찾지 못해서 편법으로 해결 했습니다.
(사실 이게 편법인지 이게 정석인지는 모르겠습니다.)
먼저 타이밍이 되었을때 실행될 루틴을 Runnable 클래스를 상속받은 새로운 클래스의 run() 함수에 구현을 하고
TimerTask를 상속받은 클래스의 run() 함수에서 Handler.port(실행될Runnable클래스); 를 등록하여
Timer에서 지정된 interval 마다 Handler에 등록된 Thread routin이 실행되도록 하여 UI를 갱신하도록 하였습니다.
Handler에서 Timer처럼 지정된 Interval 마다 실행되게 하는 방법을 찾지 못해서 편법으로 해결 했습니다.
(사실 이게 편법인지 이게 정석인지는 모르겠습니다.)
먼저 타이밍이 되었을때 실행될 루틴을 Runnable 클래스를 상속받은 새로운 클래스의 run() 함수에 구현을 하고
TimerTask를 상속받은 클래스의 run() 함수에서 Handler.port(실행될Runnable클래스); 를 등록하여
Timer에서 지정된 interval 마다 Handler에 등록된 Thread routin이 실행되도록 하여 UI를 갱신하도록 하였습니다.