【问题标题】:Unable to dismiss progress dialog无法关闭进度对话框
【发布时间】:2011-11-10 08:44:29
【问题描述】:

这是我试图关闭对话框的代码段,但它没有被关闭,而且我在 logcat 上也没有收到任何错误。请纠正我哪里错了?

所有的 Log.v 语句都被执行。甚至在pd.dismiss() (Log.v("TAG","progress dismiss");) 之后的 log.v 语句也被打印出来。

请指出我的错误或提出一些替代方法来关闭进度对话框。

 btnSave.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View arg0) {

                        // TODO Auto-generated method stub
                        //do something
                        } else {
                            Log.v("TAG","above progressDialog");
                            final ProgressDialog pd = new ProgressDialog(ChangePassword.this);
                            ProgressDialog.show(ChangePassword.this, "", "Loading...", false, true);
                            new Thread() {
                                public void run() {
                                    try {                               
                                        sleep(2000);
                                        Log.v("TAG","in try block");
                                    } catch (Exception e) {
                                        Log.e("tag", e.getMessage());
                                    }
                                    // dismiss the progress dialog
                                    pd.dismiss();
    //                              Log.v("TAG","progress dismiss");
                                }
                            }.start();
                            Log.v("TAG","after start");


                             public void run()
                             {
                                 try{

                                     if (!(txtOldPass.getText().toString())
                                            .equals(SetGetValues.getPassword())) {

                                        Toast.makeText(ChangePassword.this,
                                                "Invalid Old Password", Toast.LENGTH_SHORT)
                                                .show();
                                        txtOldPass.setText("");
                                        txtNewPass.setText("");
                                        txtCnfPass.setText("");
                                    } else {
                                        if (!(txtNewPass.getText().toString())
                                                .equals(txtCnfPass.getText().toString())) {
                                            Toast.makeText(ChangePassword.this,
                                                    "Re-Enter New Password",
                                                    Toast.LENGTH_SHORT).show();
                                            txtOldPass.setText("");
                                            txtNewPass.setText("");
                                            txtCnfPass.setText("");
                                        } else {
                                            try {

    handler = new Handler();
                         handler.postDelayed(new Thread (new Runnable(){
                                                JSONStringer loginuser = new JSONStringer()
                                                        .object()
                                                        .key("userid")
                                                        .value(SetGetValues.getUserid()
                                                                .trim())
                                                        .key("password")
                                                        .value(txtCnfPass.getText()
                                                                .toString().trim())
                                                        .key("oldpassword")
                                                        .value(txtOldPass.getText()
                                                                .toString().trim())
                                                        .endObject();
                                                StringEntity entity = new StringEntity(
                                                        loginuser.toString());
                                                JSONObject results = bc
                                                        .returnJSONObject(loginuser,
                                                                "url");

                                                String message = results
                                                        .getString("message");
                                                String isvalid = results
                                                        .getString("isvalid");
                                                if (isvalid.contains("FALSE")) {
                                                } else {
                                                    //pd.dismiss();
                                                    Toast.makeText(
                                                            ChangePassword.this,
                                                            "Password changed successfully",
                                                            Toast.LENGTH_SHORT).show();
                                                }
                                            } catch (Exception e) {
                                                 //TODO: handle exception
                                                e.printStackTrace();
                                            }
                                        }
                                    }
                             }catch(Exception e)
                             {
                                 e.printStackTrace();
                             }
                             }
                            }), 1000);


                        }
                    }

                });

【问题讨论】:

  • 亲爱的你到底想实现什么? Webservice调用,数据库操作还是其他?
  • @Paresh Mayani :我试图在调用网络服务时显示进度对话框。
  • 谢谢大家的回复
  • 只是一个快速的建议:当你想在后台实现 web 服务调用或任何长时间运行的任务时,在此期间还想显示进度条,那么 AsyncTask 是最好的实现概念。有关相同的更多信息,请查看此示例:goo.gl/ntYJd

标签: android progressdialog


【解决方案1】:

您不会关闭您正在显示的同一个 ProgressDialog。替换这个:

final ProgressDialog pd = new ProgressDialog(ChangePassword.this);
ProgressDialog.show(ChangePassword.this, "", "Loading...", false, true);

用这个:

final ProgressDialog pd = ProgressDialog.show(ChangePassword.this, "", "Loading...", false, true);

【讨论】:

    【解决方案2】:
    if (pd.isShowing()) {
                 pd.dismiss();
       }
    

    而不是使用线程使用异步任务 usage

    【讨论】:

      【解决方案3】:

      您的问题可能是,您正在尝试从另一个线程修改 UI(关闭对话框)。我很惊讶您没有收到错误消息。尝试从 UI 线程中关闭对话框,例如使用 .runOnUIThread()

      【讨论】:

        【解决方案4】:

        因为您试图在非 UI 线程中使用 UI 线程 progressDialog 的元素。 这将只允许通过 AsyncTaskhandlerRunOnUIThread(runnable) 进行。

        阅读更多关于它们并使用任何一个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多