android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@3854e45 is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:1414) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:408) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) at android.app.Dialog.show(Dialog.java:361) at android.app.ProgressDialog.show(ProgressDialog.java:190) at android.app.ProgressDialog.show(ProgressDialog.java:147) at com.example.spnclient.DeviceHistoryActivity.getHistoryInfo(DeviceHistoryActivity.java:116) at com.example.spnclient.DeviceHistoryActivity.lambda$onCreate$0$DeviceHistoryActivity(DeviceHistoryActivity.java:109) at com.example.spnclient.-$$Lambda$DeviceHistoryActivity$DsxYKdi-splpEv-okxWR_g3VSRM.run(Unknown Source:2) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8130) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1028)
时间: 2023-12-07 18:03:09 浏览: 159
这个错误通常是由于Activity已经被销毁,而ProgressDialog仍在尝试显示,因此无法添加窗口。解决方法是在ProgressDialog显示之前检查Activity是否仍在运行。你可以使用以下代码来解决这个问题:
```
if (!isFinishing()) {
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
progressDialog.show();
}
```
这个代码片段检查Activity是否已经被销毁,如果Activity仍在运行,则显示ProgressDialog。如果Activity已经被销毁,则不会显示ProgressDialog,从而避免了BadTokenException的出现。
另外,ProgressDialog已经被标记为过时,推荐使用ProgressBar或其他更现代化的替代品。
相关问题
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
这个错误通常在 Android 开发中出现,意味着尝试向一个无效的窗口(token为null)添加一个新的窗口。这个问题通常是由于尝试在一个已经被销毁或不再可见的活动中显示对话框或弹出窗口引起的。
要解决这个问题,你可以检查以下几个方面:
1. 确保你正在正确地管理活动的生命周期。如果活动已经销毁或不可见,你应该避免在其上显示对话框或弹出窗口。可以通过在显示对话框或弹出窗口之前检查活动的状态来避免这个问题。
2. 如果你正在使用异步任务或后台线程来显示对话框或弹出窗口,确保在显示之前检查活动的状态。你可以使用 `isFinishing()` 方法检查活动是否已经被销毁。
3. 确保你使用的上下文(Context)是有效的。有时候,当你尝试使用无效的上下文来显示对话框或弹出窗口时,会导致这个错误。确保你使用的上下文是当前活动的上下文。
如果以上方法都没有解决问题,你可以提供更多的代码和错误信息,以便我能够更具体地帮助你解决这个问题。
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
这个错误通常是由于在Activity的生命周期函数还没有执行完毕时,就尝试在PopupWindow或Dialog中添加窗口导致的。具体来说,可能是在Activity的onCreate函数中尝试添加PopupWindow或Dialog,而此时Activity的生命周期函数还没有执行完毕,所以无法获取到正确的Window Token。解决方法是将PopupWindow或Dialog的添加操作放到Activity的onWindowFocusChanged函数中,这个函数会在Activity的生命周期函数全部执行完毕之后被调用,此时就可以获取到正确的Window Token了。
以下是一个示例代码:
```java
public class MainActivity extends AppCompatActivity {
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = findViewById(R.id.button);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
// 在这里添加PopupWindow或Dialog
PopupWindow popupWindow = new PopupWindow(this);
View contentView = LayoutInflater.from(this).inflate(R.layout.popup_window, null);
popupWindow.setContentView(contentView);
popupWindow.showAsDropDown(mButton);
}
}
}
```
阅读全文