본문 바로가기

개발환경/andriod studio

[Android][Kotlin] android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

 

 

에러 원인 

뷰 계층을 만든 original thread만  뷰에 접근 가능하다!

 

사진의  왼쪽상황 인것이다

 

여기서 UI 자원이 user interface인 view를 의미하고

UI Thread(=main thread)는 original thread를 의미한다

 

즉, UI(view)에대한 내용을 UI스레드가 아닌 다른 스레드에서 사용을 했다는 것이다

 

나의 경우는 백그라운드 스레드에서 UI 작업을 해서 발생하였다

 

해결방법은 오른쪽 사진처럼 만들어준다

 

 

 

해결 방법

ui자원 자원 사용 메시지를 UI 스레드에 전달한다!

 

runOnUiThread로 감싸주어 사용한다

 

 

감싸기 전 코드

private fun start() {
        
        ...

 
            binding.tvMillisecond.text =
                        if(milli_sec<10) ".0${milli_sec}"
                        else ".${milli_sec}"
            binding.tvSecond.text =
                        if(sec<10) ":0${sec}"
                        else ":${sec}"
           binding.tvMinute.text = "${minute}"

    }

 binding.xxx 로 view 부분을 바꾸는 코드때문에 에러가 발생한다

 

 

 

감싼 후 코드

private fun start() {

		...

       runOnUiThread { // UI스레드 생성

            binding.tvMillisecond.text =
                   if(milli_sec<10) ".0${milli_sec}"
                   else ".${milli_sec}"
            binding.tvSecond.text =
                   if(sec<10) ":0${sec}"
                   else ":${sec}"
           binding.tvMinute.text = "${minute}"
       }
}

 

현재 thread가 UI스레드이면 바로 괄호 안의 코드를 바로 실행을하고

현재 thread가 UI스레드가 아니면 post방식으로 UI 스레드에 보낸다

 

 

 

 

추가설명

.

 

 

 

 

 

 

 

 

 

 

 

 

참고

 

runOnUiThread

https://developer.android.com/reference/android/app/Activity#runOnUiThread(java.lang.Runnable) 

 

Activity  |  Android Developers

 

developer.android.com

 

https://itmining.tistory.com/6

 

[안드로이드] runOnUiThread란? (개념과 사용법)

이 글은 PC 버전 TISTORY에 최적화 되어있습니다. 서론 이전 포스팅 (Thread, Handler, Looper를 이용한 백그라운드 처리) 에서 언급했듯이, 안드로이드 OS 는 UI 자원에 Main Thread와 Sub Thread가 동시 접근하여

itmining.tistory.com