Anroid 异常:is not valid; is your activity running?

本文探讨了在Android开发中遇到的一个常见问题:当子Activity尝试弹出对话框时出现BadTokenException异常。文章分析了问题产生的原因,并提供了解决方案——通过使用父Activity的内容视图来替代当前子Activity的内容视图。

是由于有activity时依附于另一个activity的,当被依附的activity 产生错误的时候,该activity没有了靠山而产生错误(或者是调用了一个已经被finish()的activity)。一般在创建 alertdialog.builder是很容易见到。

对于这个错误 还没有根本的解决办法,唯一的办法就是改变该activity依附于另一activity的事实,将其放入另一activity。


 

Android利用ActivityGroup加载子Activity,子Activity调用对话框,弹出:

ERROR/AndroidRuntime(10104): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@45a58ee0 is not valid; is your activity running?

 

原因分析:

因为new对话框的时候,参数content 指定成了this,即指向当前子Activity的content。但子Activity是动态创建的,不能保证一直存在。其父Activity的content是稳定存在的,所以有下面的解决办法。

 

解决办法: 

将content替换为getParent()即可。

在 Android 中,出现 “Unable to add window -- token null is not valid; is your activity running?” 错误通常是由于尝试在无效的上下文或 Activity 未处于活动状态时添加窗口导致的。以下是一些可能的解决方法: ### 使用 Activity 上下文而非 Application 上下文 许多开发者在创建对话框、PopupWindow 等窗口时,错误地使用了 `getApplicationContext()`,而应该使用 Activity 的上下文。例如,在使用 `DatePickerDialog` 时,如果设置 context 为 `getApplicationContext()` 会出现该错误,应改为使用 Activity 的上下文: ```java // 错误示例 DatePickerDialog dialog1 = new DatePickerDialog(getApplicationContext(), new DatePickerDialog.OnDateSetListener() { // ... }); // 正确示例 DatePickerDialog dialog2 = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() { // ... }); ``` 在创建 `KProgressHUD` 或其他窗口时也应遵循此原则,避免使用 `getApplicationContext()` [^3][^5]。 ### 确保 Activity 处于活动状态 在显示对话框、PopupWindow 等窗口之前,要确保 Activity 是处于活动状态的。可以在显示窗口之前检查 Activity 是否已经销毁或正在销毁: ```java if (!isFinishing() && !isDestroyed()) { // 显示对话框、PopupWindow 等操作 PopupWindow popupWindow = new PopupWindow(); popupWindow.showAsDropDown(view); } ``` ### 在合适的生命周期方法中显示窗口 避免在 Activity 的 `onCreate()` 方法中直接显示需要依赖窗口令牌的视图,因为此时 Activity 可能还未完全初始化。可以将显示窗口的操作移到 `onResume()` 方法中: ```java @Override protected void onResume() { super.onResume(); // 显示对话框、PopupWindow 等操作 PopupWindow popupWindow = new PopupWindow(); popupWindow.showAsDropDown(view); } ``` ### 检查网络加载时的 Activity 状态 在进行网络加载并显示 loading 视图时,要确保 Activity 处于活动状态。可以在显示 loading 视图之前检查 Activity 的状态: ```java if (!isFinishing() && !isDestroyed()) { mLoadingKProgressHUDView = LayoutInflater.from(this).inflate(R.layout.view_kprogress_hud_loading, null); mLoadingKProgressHUD = KProgressHUD.create(this, false); mLoadingKProgressHUD.show(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值