[Android] Dialog 에서 android.view.WindowManager$BadTokenException 발생
오랫동안.. 간헐적으로 발생하는 문제가 있었습니다.
android.view.WindowManager$BadTokenException:
at android.view.ViewRootImpl.setView (ViewRootImpl.java:1056)
at android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:381)
at android.view.WindowManagerImpl.addView (WindowManagerImpl.java:93)
at android.app.Dialog.show (Dialog.java:470)
at com.xxx.yyy.zzz.widget.WaitingDialog$1.run (WaitingDialog.java:62)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:214)
at android.app.ActivityThread.main (ActivityThread.java:7050)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:965)
WaitingDialog를 만들어서 사용중인데.. Dialog입니다.
Dialog에서 show()를 하는 부분에서.. 간헐적으로 android.view.WindowManager$BadTokenException가 발생하네요.
if(((Activity)context).isFinishing()){
//nothing to do
}else{
waitingDialog.show();
}
예전에도 이 문제를 겪은 적이 있고.. 그 때 해결책은 isFinishing 체크를 하는 것이라고 하여.. 수정했는데도 문제가 발생하네요. 흠..
현재 신기하게도.. 삼성 단말에서만 문제가 발생하고 있습니다.
Galaxy S9 (starqlteue) | 1 | 16.7% |
Galaxy A9 Pro (a8sqlteks) | 1 | 16.7% |
Galaxy S10 5G (beyondx) | 1 | 16.7% |
Galaxy Note8 (greatlteks) | 1 | 16.7% |
Galaxy Note9 (crownqltesq) | 1 | 16.7% |
Galaxy S8 (dreamlte) | 1 | 16.7% |
OS는.. 안드로이드 9와 10에서 발생하네요.
Android 9 | 5 | 83.3% |
Android 10 | 1 | 16.7% |
문제가 발생하는 정확한 위치는..
android.view.ViewRootImpl.setView (ViewRootImpl.java:1056)
이 곳인데..
안드로이드 소스를 삼성에서 좀 고쳐쓴 것 같습니다..
안드로이드 공식 소스를 보면..BadTokenException을 발생시키는 곳은 아래입니다.
switch (res) {
case WindowManagerGlobal.ADD_BAD_APP_TOKEN:
case WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN:
throw new WindowManager.BadTokenException(
"Unable to add window -- token " + attrs.token
+ " is not valid; is your activity running?");
case WindowManagerGlobal.ADD_NOT_APP_TOKEN:
throw new WindowManager.BadTokenException(
"Unable to add window -- token " + attrs.token
+ " is not for an application");
case WindowManagerGlobal.ADD_APP_EXITING:
throw new WindowManager.BadTokenException(
"Unable to add window -- app for token " + attrs.token
+ " is exiting");
case WindowManagerGlobal.ADD_DUPLICATE_ADD:
throw new WindowManager.BadTokenException(
"Unable to add window -- window " + mWindow
+ " has already been added");
case WindowManagerGlobal.ADD_STARTING_NOT_NEEDED:
// Silently ignore -- we would have just removed it
// right away, anyway.
return;
case WindowManagerGlobal.ADD_MULTIPLE_SINGLETON:
throw new WindowManager.BadTokenException("Unable to add window "
+ mWindow + " -- another window of type "
+ mWindowAttributes.type + " already exists");
case WindowManagerGlobal.ADD_PERMISSION_DENIED:
throw new WindowManager.BadTokenException("Unable to add window "
+ mWindow + " -- permission denied for window type "
+ mWindowAttributes.type);
case WindowManagerGlobal.ADD_INVALID_DISPLAY:
throw new WindowManager.InvalidDisplayException("Unable to add window "
+ mWindow + " -- the specified display can not be found");
case WindowManagerGlobal.ADD_INVALID_TYPE:
throw new WindowManager.InvalidDisplayException("Unable to add window "
+ mWindow + " -- the specified window type "
+ mWindowAttributes.type + " is not valid");
}
6곳에서 BadTokenException를 발생시킵니다.
이 중에서 정확히.. 어느 부분에 걸려 문제가 생기는지 알면 좋을텐데요.. 흠..
댓글 영역