티스토리 뷰
[오류해결] java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare()
알 수 없는 사용자 2022. 4. 20. 00:01
어느 날 제가 만든 안드로이드 모듈(라이브러리)를 사용하던 사람이 오류가 났다고 하는 겁니다!! 아니 어째서 저는 잘 만들었고 문제 없다고 생각해서 배포한 건데 왜째서 오류가 났다고 하는 것이지?!?! 라고 생각했던 기억이 있는데요.
일단 오류 내용은 이렇습니다.
java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare()
위 오류의 발생원인은 사실 제가 만든 앱이 Thread 에서 동작하는데 Thread handler 에서 Toast 와 같은 UI 기능을 수행하려던 것이 문제였죠. 안드로이드 뿐만 아니라 다른 프로그래밍 언어로 작성된 프로그램들에서도 기본적으로 UI Thread 즉 Main Thread 가 아닌 Thread 에서 UI를 조작하려고 하면 오류가 발생하곤 합니다. 그것처럼 이번 경우도 UI Thread 가 아닌 Thread에서 Toast message 를 띄우려고 하였기 발생한 오류가 바로 위와 스크린샷 이미지와 같습니다.
Android 에서 왜 다른 Thread 에서 UI Thread를 핸들링할 수 없게 한 것인지 궁금하시다면 아래 링크를 참고해보시면 도움되실 겁니다.
https://developer.android.com/guide/components/processes-and-threads
해결방법으로는 위 링크에 들어가셔서 문서를 보시면 아시겠지만 여러가지가 있을 수 있는데요. 일단 제가 정리하려고 하는 방법은 Handler를 이용하는 방법과 UI Thread 를 이용하는 방법입니다.
1. Handler 를 이용하는 방식
Handler handler = new Handler(Looper.getMainLooper())
handler.postDelayed(new Runnable() {
@Override
public void run()
{
Toast.makeText(
getApplicationContext().getApplicationContext(),
getApplication().getString("sample toast message"), Toast.LENGTH_SHORT)
.show()
}
}, 0)
2. UI Thread 를 이용하는 방식
runOnUiThread{
Toast.makeText(
getApplicationContext().getApplicationContext(),
getApplication().getString("sample toast message"), Toast.LENGTH_SHORT)
.show()
}
위 두 가지 방식 중에서 선택하고자 한다면 아래 방법이 더 짧으니 활용성이 좋아보일 것 같아서 저는 우선 단순히 Toast message 를 띄워주고 싶다면 runOnUiThread 를 사용해서 테스트 해보라고 말해주었답니다! 그랬더니 잘 된다고 하는 것 같더군요!
- 오류 해결 끝 -
'프로그래밍 > Android' 카테고리의 다른 글
[오류해결] adb에서 frida-server 실행 시 not executable: magic FD37 (0) | 2022.08.09 |
---|---|
[오류해결] AndroidStudio - unauthorized for adb devices (0) | 2022.04.22 |
[Android] adb : [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2] 오류 해결 방법 (0) | 2022.03.31 |
[Android] GooglePlay - 안전하지 않은 HostnameVerifier 해결 방법 (0) | 2022.02.21 |
[Android] APK 파일 리패키징(repackaging)하는 방법 (1) | 2021.12.03 |