Unable to add window -- token android.os.BinderProxy@164db98f is not valid; is your activity running

本文介绍了一种在Android开发过程中遇到的问题:当Activity被关闭前弹出Dialog导致的闪退现象。通过分析原因并提供解决方案,即在显示Dialog前检查Activity是否已处于结束状态。

有一次在项目中用Dialog的时候出现了闪退,报了一个“Unable to add window -- token android.os.BinderProxy@164db98f is not valid; is your activity running?”的异常;

我出现异常的情况是进入一个页面,等这个页面的数据加载完后弹出一个dialog,但是我在dialog还没弹出的时候就finish掉了这个页面,这个时候就会出现如上的异常情况。出现这种情况,我的分析是在dialog还没有显示的时候就finish掉了它要显示的Activity,所以等它显示的时候,它要显示的Activity已经finish了;

解决办法如下,在显示之前调用activity的isFinishing方法判断一下,如果是false再显示:

Android 中,PopupWindow 的 `showAtLocation()` 方法抛出 “Unable to add window -- token android.view.ViewRootImpl$W@84bb749 is not valid; is your activity running?” 错误,通常是因为 PopupWindow 需要依附在一个有效的 Activity 或视图上,而此时提供的 token 无效,可能是 Activity 还未完全创建好或者视图还未附加到窗口上。以下是几种可能的解决办法: ### 确保在 Activity 完全创建后调用 避免在 `onCreate()` 或 `onStart()` 中过早调用 `showAtLocation()` 方法,因为此时 Activity 可能还未完全创建好。可以将调用移到 `onResume()` 方法中,确保 Activity 已经处于可见且可交互状态。 ```java @Override protected void onResume() { super.onResume(); // 在这里调用 showAtLocation() 方法 popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.CENTER, 0, 0); } ``` ### 使用有效的视图 token 确保传递给 `showAtLocation()` 方法的 token 是有效的。可以使用当前 Activity 的根视图的 token,而不是其他可能无效的 token。 ```java View rootView = getWindow().getDecorView().getRootView(); popupWindow.showAtLocation(rootView, Gravity.CENTER, 0, 0); ``` ### 延迟显示 PopupWindow 如果在某些情况下,即使在 `onResume()` 中调用仍然出现问题,可以尝试延迟一段时间后再显示 PopupWindow,确保视图和 Activity 已经完全准备好。 ```java new Handler().postDelayed(new Runnable() { @Override public void run() { popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.CENTER, 0, 0); } }, 200); // 延迟 200 毫秒 ``` ### 检查 Activity 状态 在显示 PopupWindow 之前,检查 Activity 是否正在运行,避免在 Activity 已经销毁或正在销毁时显示 PopupWindow。 ```java if (!isFinishing() &&!isDestroyed()) { popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.CENTER, 0, 0); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值