解决:Unable to add window -- token android.os.BinderProxy is not valid; is your activity running?

报错: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。如下:

progressDialog = new ProgressDialog(Application.getContext());

结果依旧报错。
这是我意料之外的。
不给既然行不通,那就之内想其他办法。
既然dialog的上下文随时变动,这个context不能被销毁,我们可以考虑两种方式:

  1. 如果应用有一个全局都不会销毁的Activity页面(一般是主页),可以尝试在进入这个页面的 onCreate() 方法当中直接进行创建。只要这个页面不被销毁,这个弹窗就可以一直使用。
  2. 在页面销毁时将这个弹窗的引用置为 null 。此后其他页面显示弹窗时会根据对应页面的Context进行创建,而不会出现这种问题。
    eg.
	@Override
    protected void onDestroy() {
    
    
        progressDialog = null;//重置加载弹窗,activity引用可能已被销毁
        super.onDestroy();
    }

猜你喜欢

转载自blog.csdn.net/qq_49757305/article/details/127304467