报错:Unable to add window – token android.os.BinderProxy is not valid; is your activity running?
这个问题是我想存储已经创建过的弹窗进行复用过程当中出现的报错,具体代码请看:
public abstract class BaseActivity extends AppCompatActivity {
protected static ProgressDialog progressDialog = null;//定义了一个创建的弹窗
/**
* 在其子类当中调用此方法显示加载弹窗,弹窗不可被取消
* @param title 标题
* @param content 内容
* @param style 进度条样式
*/
protected void showLoadingDialog(@Nullable String title, @Nullable String content, int style) {
if (progressDialog == null) {
progressDialog = new ProgressDialog(BaseActivity.this);
progressDialog.setProgressStyle(style);
progressDialog.setTitle(TextUtils.isEmpty(title) ? "稍等" : title);
progressDialog.setMessage(TextUtils.isEmpty(content) ? "加载中" : content);
progressDialog.setCancelable(false);
progressDialog.create();
}
progressDialog.show();
}
}
在查看报错之后可以确定是 Context 上下文的问题。
在创建Dialog时需要在构造方法当中传递一个Context,如果这个上下文被销毁即这个Activity已经走了OnDestroy方法。那么这个上下文就无效了,这个dialog在再次被调用时就会报错。
大概明白报错原因之后,我尝试将这个 Context 设置为全局的Application。如下:文章来源:https://www.toymoban.com/news/detail-493635.html
progressDialog = new ProgressDialog(Application.getContext());
结果依旧报错。
这是我意料之外的。
不给既然行不通,那就之内想其他办法。
既然dialog的上下文随时变动,这个context不能被销毁,我们可以考虑两种方式:文章来源地址https://www.toymoban.com/news/detail-493635.html
- 如果应用有一个全局都不会销毁的Activity页面(一般是主页),可以尝试在进入这个页面的 onCreate() 方法当中直接进行创建。只要这个页面不被销毁,这个弹窗就可以一直使用。
- 在页面销毁时将这个弹窗的引用置为 null 。此后其他页面显示弹窗时会根据对应页面的Context进行创建,而不会出现这种问题。
eg.
@Override
protected void onDestroy() {
progressDialog = null;//重置加载弹窗,activity引用可能已被销毁
super.onDestroy();
}
到了这里,关于解决:Unable to add window -- token android.os.BinderProxy is not valid; is your activity running?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!