[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을 발생시키는 곳은 아래입니다.

(https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-9.0.0_r53/core/java/android/view/ViewRootImpl.java)

 

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를 발생시킵니다.

이 중에서 정확히.. 어느 부분에 걸려 문제가 생기는지 알면 좋을텐데요.. 흠..

 

 

작성자

Posted by 드리머즈

관련 글

댓글 영역