본문 바로가기
안드로이드 공부 노트/오류

[오류] android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 해결 법

by 지게요 2022. 12. 18.
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
반응형