android - 令牌 android.os.BinderProxy@be12cf1 的应用程序有太多的 windows 20
问题描述
致命异常:android.view.WindowManager$BadTokenException 无法添加窗口——令牌 android.os.BinderProxy@be12cf1 的应用程序有太多窗口 20
我在我的 crashlytics 中经常遇到这种崩溃。我无法共享代码,但任何人都可以帮助提供导致此崩溃的代码片段吗?
ps:在android源代码中找不到这个错误。
Fatal Exception: android.view.WindowManager$BadTokenException: Unable to add window -- app for token android.os.BinderProxy@7fd051f has too many windows 20
at android.view.ViewRootImpl.setView(ViewRootImpl.java:993)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:408)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
at android.app.Dialog.show(Dialog.java:372)
at androidx.fragment.app.DialogFragment.onStart(DialogFragment.java:529)
at androidx.fragment.app.Fragment.performStart(Fragment.java:2731)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:365)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1206)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1368)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1446)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1509)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2637)
at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:2595)
at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:258)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:550)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
at com.carthero.driver.views.activities.BaseActivity.onStart(BaseActivity.java:101)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1479)
at android.app.Activity.performStart(Activity.java:7891)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3545)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2242)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:230)
at android.app.ActivityThread.main(ActivityThread.java:7789)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
解决方案
此异常是从您的应用程序进程内的 Android 框架代码中引发的。堆栈跟踪指向 ViewRootImpl.setView,在该文件中,我们可以找到几个 WindowManager$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");
case WindowManagerGlobal.ADD_INVALID_USER:
throw new WindowManager.BadTokenException("Unable to add Window "
+ mWindow + " -- requested userId is not valid");
}
因此,您可能正面临特定制造商所做的源更改,因为他们的设备无法从单个应用程序处理那么多窗口。
错误消息表明您的应用程序已经添加了 20 个窗口,这看起来很多,但对于深度活动堆栈可能有意义(因为每个活动 = 1 个窗口)。
您可以尝试使用方形/窗帘来跟踪正在添加的窗口并找出高数字的来源。
推荐阅读
- ms-access - 使用文本框根据关键字搜索条目(单独实体有多个文本框)并实现组合框
- openmaptiles - png 文件在提取 mbtiles 后不可读
- python - 基维 | 直到程序结束屏幕才会改变
- javascript - 在一个列表项中显示/隐藏一个元素,而不是全部
- python - 有什么方法可以在另一个字段更改之前不计算计算字段?
- informatica - 将系统时间戳转换为毫秒
- python - 有人可以解释这个 Python(变量=类型,变量=列表=列表等)吗?
- php - 如何以不会成为僵尸进程的方式破坏子进程?
- html - 如何用shell脚本替换html文件中的多行文本?
- php - 如何删除 UTF-32 字符?