티스토리 뷰

728x90
반응형

android.com

어느 날 제가 만든 안드로이드 모듈(라이브러리)를 사용하던 사람이 오류가 났다고 하는 겁니다!! 아니 어째서 저는 잘 만들었고 문제 없다고 생각해서 배포한 건데 왜째서 오류가 났다고 하는 것이지?!?! 라고 생각했던 기억이 있는데요.

 

일단 오류 내용은 이렇습니다.

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

 

프로세스 및 스레드 개요  |  Android 개발자  |  Android Developers

프로세스 및 스레드 개요 애플리케이션 구성 요소가 시작되고 애플리케이션에 실행 중인 다른 구성 요소가 없으면 Android 시스템은 하나의 실행 스레드로 애플리케이션의 Linux 프로세스를 시작

developer.android.com

 

해결방법으로는 위 링크에 들어가셔서 문서를 보시면 아시겠지만 여러가지가 있을 수 있는데요. 일단 제가 정리하려고 하는 방법은 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 를 사용해서 테스트 해보라고 말해주었답니다! 그랬더니 잘 된다고 하는 것 같더군요!

 

- 오류 해결 끝 -

728x90
반응형
댓글