【问题标题】:Android: progress dialog raises on closeAndroid:关闭时出现进度对话框
【发布时间】:2016-11-14 09:30:31
【问题描述】:

我已经创建了一个 Util 类来像这样打开和关闭进度对话框

Utils.java

public class Utils {

    private static Utils util;
    private Typeface typeface;
    private ProgressDialog progressDialog;

    public static Utils getInstance(){

        if(util == null){
            util = new Utils();
        }
        return util;
    }

    public void showProgressDialog(Activity activity){

        if(progressDialog != null && progressDialog.isShowing()){
            return;
        }

        if(progressDialog == null ) {
            progressDialog = new ProgressDialog(activity);
        }
        progressDialog.setMessage("Loading...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setCancelable(false);
        progressDialog.show();
     }

public void closeProgressDialog(){
    try {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }catch(Exception e){
        e.printStackTrace();
    }
  }
}

然后我在加载数据之前调用 showProgressDialog 并在加载数据之后调用 closeProgressDialog。像这样

活动代码

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_dashboard,container,false);
    activity = getActivity();
    ButterKnife.bind(this,view);

    init();
    return view;
}

  private void init() {

    Utils.getInstance().showProgressDialog(activity);
    getPatientsList();


   //in response i am calling closeProgressDialog();
  }

 public void onPatientListResponse(String response){
         Utils.getInstance().closeProgressDialog(); // raises exception here
  }

但它在 closeProgressDialog() 中引发异常;

java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{f7fd12e V.E...... R......D 0,0-1024,232} not attached to window manager

【问题讨论】:

    标签: android performance progressdialog


    【解决方案1】:

    试试这个,

    不管怎样,你会检查 progressDialog 是否已经显示,如果是,你只是返回控件。而不是关闭progressDialog并创建一个新实例。因为旧的 progressDialog 可能以不同的上下文开始。

    public void showProgressDialog(Activity activity){
    
            if(progressDialog != null && progressDialog.isShowing()){
                progressDialog.dismiss();
                progressDialog = null;
            }
    
            if(progressDialog == null ) {
                progressDialog = new ProgressDialog(activity);
            }
            progressDialog.setMessage("Loading...");
            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressDialog.setCancelable(false);
    
            if(!activity.isFinishing())
               progressDialog.show();
         }
    

    【讨论】:

    • 非常感谢。实际上,在之前的活动中,我在调用新活动之前没有调用 closeProgressDialog()。所以在调用 showProgressDialog() 的新活动中,它只是返回了之前的对话框。所以对话框之前的活动,我在新活动中调用了closedialog。非常感谢!
    • 现在我确保在离开活动或片段之前调用closedialog。
    • @Androidjack 很高兴!这有帮助:)
    【解决方案2】:
     public void showProgressDialog(Activity activity){
    
            if(progressDialog != null){  // Ensure it's not null
              if(progressDialog.isShowing()) // if it's showing than return.
                return;
            }else{
              //It will create an instance of new object.
                progressDialog = new ProgressDialog(activity);
            }
    
            progressDialog.setMessage("Loading...");
            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressDialog.setCancelable(false);
            progressDialog.show();
         }
    

    【讨论】:

    • @Raghavendra 不,他检查的不是 null,而是检查 isVisible,我确实分离了一个 null 条件以确保它不是 null。
    • 我想你已经知道这一点,如果有两个条件,如果第一个失败,它不会检查第二个,在这种情况下,他正在做的事情对我来说很好。
    • 是的,它永远不会进入状态,另外添加的部分是启动进度对话框对象,因为他们提到 (progressDialog == null) 来创建对象,这看起来很奇怪。
    【解决方案3】:

    你甚至还没有初始化你的进度条,你正在尝试检查它是否正在显示......

    这里你还没有初始化你的进度条,但是由于你的条件是 && (AND),编译器应该检查两者并发现 progressDialog 为空,因此没有 isShowing 方法......

    if(progressDialog != null && progressDialog.isShowing()){
            return;
        }
    --------------------------------------------------
    public void showProgressDialog(Activity activity){
        if(progressDialog == null ) {
            progressDialog = new ProgressDialog(activity);
        }
        progressDialog.setMessage("Loading...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setCancelable(false);
        progressDialog.show();
     }
    

    一个建议是在进度条中使用上下文而不是活动。

    干杯!

    【讨论】:

    • 哪里没有初始化?
    • 是的,但我检查了它那里没有给出异常。
    【解决方案4】:

    我以前也遇到过这个问题,用下面的代码解决了。

    private boolean isDialogViewAttachedToWindowManager() {
        if (dialog.getWindow() == null) return false;
        View decorView = progressDialog.getWindow().getDecorView();
        return decorView != null && decorView.getParent() != null;
    }
    

    或尝试以下解决方案。

    if (pDialog instanceof Activity && !((Activity) mContext).isFinishing())
            pDialog.show();
    

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多