好的做法是使用Progress Dialog As Singleton Class

时间:2018-05-20 10:17:35

标签: android singleton progressdialog

我有Progress Dialog Class,它是singleton

public class ProgressDialogManager {

private static ProgressDialogManager manager = null;

private Context context;

private ProgressDialog pDialog = null;

private ProgressDialogManager(Context context) {
    this.context = context;

}

public static ProgressDialogManager getInstance(Context context) {
    if (manager == null)
        manager = new ProgressDialogManager(context);
    return manager;
}

public void showDialog(String msg) {
    if (pDialog == null)
        pDialog = new ProgressDialog(this.context);
    pDialog.setMessage(msg);
    pDialog.show();
}

public void closeDialog() {
    if (pDialog != null) {
        pDialog.dismiss();
    }
 }
}

当getInstance(this)方法我得到多个活动并且出错

android.view.WindowManager$BadTokenException: Unable to add window — token android.os.BinderProxy@447a6748 is not valid; is your activity running?

我的问题是 是不是很好的做法Progress Dialog As Singleton Class以及Error如何解决它的原因是什么

1 个答案:

答案 0 :(得分:1)

  

android.view.WindowManager $ BadTokenException:无法添加窗口

如果您尝试向dialog显示已完成的Activity并且您正在通过其context以在另一个dialog中显示Activity,则会发生此异常1}}。

您的代码会创建该方案:

假设您在ProgressDialogManager中创建了Activity的实例,并在dialog中显示Activity哪个可以正常工作。

现在您已销毁 Activity并移至另一个Activity但您之前创建的ProgressDialogManager实例未被销毁,因为您将其设为单身。现在,如果您尝试获取ProgressDialogManager的实例,它将返回先前创建的ProgressDialogManager,并且它包含已被销毁的上一个context的{​​{1}}。

现在,如果您尝试显示对话框,那么它将抛出此异常,因为您尝试使用死Activity显示对话框。

要解决此问题,请在context中传递context并移除showDialognull的{​​{1}}检查。

dialog
  

注意:不要将Context作为任何类的单例成员,因为   上下文一直在变化