개발관련일지

안드로이드 WindowManager$BadTokenException 오류 해결 본문

개발기록/안드로이드

안드로이드 WindowManager$BadTokenException 오류 해결

BEECHANGBOT 2021. 7. 8. 04:35

WindowManager$BadTokenException 

처음 보는 오류여서 검색해보았는데 대부분 유저들의 내용으론 화면에 보여질 컨테스트와 다이얼로그의 문제였다

내 경우는 죽은 액티비티에 서브스레드에서 다이얼로그를 요청하는 상황에서 에러가 나온다 생각했다.

위와 같은 상황이었고 서브스레드를 돌려놓고 엑티비티를 종료하니 에러를 만날 수 있었다.

에러 메시지

해결방법으론 엑티비티의 종료여부를 보고 다이얼로그를 안띄우는 방식이 있엇다

isFinishing()을 사용해서 아래 코드처럼 해결이 될것이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(! 액티비티.this.isFinishing()){
                new MaterialAlertDialogBuilder(액티비티.this)
                        .setTitle("제목")
                        .setMessage("내용")
                        .setCancelable(false)
                        .setPositiveButton("확인"/* listener = */ new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO 진행코드
                                dialog.dismiss();
                            }
                        })
                        .show();
            }
cs

 

근데 isFinishing() 이란 것도 처음 보았다.  코드를 따라가서 보니

isFinishing , isDestorying

종료되는 중이면 트루를 리턴한다고 한다. 밑에 보니 디스트로이도 있었다. 동작하는 순서를 로그를 이용해서 확인해보았다.

 

해당 엑티비티가 화면에서 벗어났을경우 로그

1. 엑티비티에서 화면에서 벗어난 이후 로그

 

엑티비티 종료를 명령 한 이후 로그

 

 

 

2. 백스페이스로 종료를 한 이후 로그

 

 

 

 

 

 

 

 

isFinishing()도 있지만 내 경우에는 서브스레드가 멈추도록 하는게 근본적인 해결방법으로 판단된다.

 

참고

https://stackoverflow.com/questions/18662239/android-view-windowmanagerbadtokenexception-unable-to-add-window-on-buider-s

 

"android.view.WindowManager$BadTokenException: Unable to add window" on buider.show()

From my main activity, I need to call an inner class and in a method within the class, I need to show AlertDialog. After dismissing it, when the OK button is pressed, forward to Google Play for pur...

stackoverflow.com

https://blog.sangyoung.me/2016/12/28/BadTokenException/

 

안드로이드 BadTokenException 의 원인과 해결방법

안드로이드 앱을 테스트하다보면 UI를 핸들링할 때, 가끔 BadTokenException이 발생하는 것을 볼 수가 있다. 보통 빌드 시에는 알 수 없고, 런타임 시점에서 발생하는 점에서 약간 골치가 아프다.

blog.sangyoung.me