728x90
반응형
최근 개발 중 timer를 사용하다가 아래와 같은 오류를 발견했다.
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
timer(period = 3000, initialDelay = 3000) {
with(binding) {
if (count >= 3) {
count = 0
} else {
++count
}
textExTitle.text = exTitleList[count]
textExContent.text = exContentList[count]
}
}
위 코드를 보면 timer 스코프 안에서 textView의 text를 변경 시키는 UI작업을 하고 있다.
# 오류 원인
하지만 Android에서는 메인 스레드만 뷰를 업데이트할 수 있다.
Android에서 UI 툴킷이 스레드로부터 안전하지 않기 때문이다.
작업자 스레드에서 UI를 업데이트하려고 하면 Android에서 이 예외가 발생한다.그래서 메인 스레드에서 UI를 업데이트해야 한다.
# 해결 방법
우선 필자는 아래 코드 처럼 코루틴 Coroutine(Dispatchers.Main).launch를 이용해서 해결을 하였다.
timer(period = 3000, initialDelay = 3000) {
CoroutineScope(Dispatchers.Main).launch {
with(binding) {
if (count >= 3) {
count = 0
} else {
++count
}
textExTitle.text = exTitleList[count]
textExContent.text = exContentList[count]
}
}
}
출처
https://velog.io/@yamamamo/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%97%90%EB%9F%AC-android.view.ViewRootImplCalledFromWrongThreadException-Only-the-original-thread-that-created-a-view-hierarchy-can-touch-its-views
반응형