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)
https://itmining.tistory.com/6
'개발환경 > andriod studio' 카테고리의 다른 글
[Android][Kotlin] viewbinding (feat. findViewById) (2) | 2022.11.28 |
---|---|
안드로이드 스튜디오 ABD 오류 detected ADB (0) | 2022.01.19 |