当我在我的 Android 应用程序上频繁执行某些操作(我的假设是由于 Toast 消息)时,出现以下错误。我没有得到此问题的确切位置。我可以从某人那里获得帮助来解决相同问题吗?
--------- beginning of crash
10-04 16:13:49.250 6541-6541/com.test.myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.test.myapp, PID: 6541
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@e2815e is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.widget.Toast$TN.handleShow(Toast.java:459)
at android.widget.Toast$TN$2.handleMessage(Toast.java:342)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
Notes:这种崩溃并不总是会发生。
在通过之前Context
对于 Toast,您应该始终检查要使用的上下文的有效性。在我的应用程序中,我使用我制作的上下文检查器方法:
public static boolean isContextValid(Context context, Fragment fragment) {
if (context instanceof Activity) {
Activity activity = (Activity) context;
if (activity.isFinishing() || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())) {
return false;
}
}
return context != null && (fragment == null || (fragment.isAdded() && !fragment.isRemoving());
}
您可以仅传递上下文,也可以传递Fragment
如果您当前的上下文是一个片段。该方法检查上下文是否是Activity
,在这种情况下,我们检查活动是否正在完成/销毁。
如果你想在fragment生命周期之后显示toast,也可以传递给当前fragment的方法,这样我们就可以知道fragment是否仍然可见并附加到activity。
额外安卓 7.1
在 API 25 上,这还不够,有时设备仍然会因您提供的堆栈跟踪而崩溃。
这个存储库 https://github.com/drakeet/ToastCompat可能是解决方案,因为它将错误的调用包装在 try/catch 子句中。当然,这不是最好的办法,但至少解决了 7.1 设备上这个恼人的崩溃问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)