【问题标题】:Android Progress dialog don't show until the end of onClick methodAndroid 进度对话框直到 onClick 方法结束才显示
【发布时间】:2017-02-07 10:09:16
【问题描述】:

我试图在单击登录按钮时显示进度对话框。但是只有当我到达我的方法 onClick 的末尾时才会显示进度对话框。而不是一个开始。 在登录方法中,我执行异步任务以到达服务器。 因此,异步任务所花费的所有时间,都没有显示进度对话框。仅当到达 onClick 方法的末尾时,才会显示进度对话框.... 有人知道我在做什么错吗?

 public void onClick(View view) {
            progressDialog = new ProgressDialog(SignIn.this);
            progressDialog.setMessage("Sign in in progress");
            progressDialog.setTitle("Please wait");
            progressDialog.setCancelable(false);
            progressDialog.setIndeterminate(true);

            progressDialog.show();

            repSignIn = signIn(SignIn.this, etEmail.getText().toString(), etPassword.getText().toString());


            if(!repSignIn.hasError())
            {
                Toast.makeText(getApplicationContext(), "Sign In successfully", Toast.LENGTH_SHORT).show();
                onBackPressed();
            }
            else
            {
                Toast.makeText(getApplicationContext(), repSignIn.getErrorMessage(), Toast.LENGTH_SHORT).show();
            }
            //progressDialog.cancel();
        }

提前非常感谢

纳丁

【问题讨论】:

    标签: android onclick dialog progressdialog progress


    【解决方案1】:

    您需要将 onPreExecute 放在您的 AsyncTask 中,而不是在 onClick 中使用 progressDialog 并在 onPostExecute 中关闭它。

    原因是AsyncTask 使用了一个异步工作线程,这就是progressDialog 提前完成的原因。

    class MyAsyncTask extends AsyncTask<Void, Void, Void>{
      @Override
      protected void onPreExecute() {
            progressDialog.show();
      }
    
      @Override
      protected Void doInBackground(Void... params) {
        // do your stuff
        return null;
      }
    
      @Override
      protected void onPostExecute(Void aVoid) {
        progressDialog.dismiss();
      }
    }
    

    【讨论】:

    • 但是 asynctask 在一个库中(我开发的)。所以我不想将进度对话框放在 onProExecute 中...我想在启动 asynctask 之前显示...
    • 库有回调吗,asyncTask有返回什么吗?
    • 在库中的方法中,我调用 asynctask 并等待它的结果。字符串结果 = new sendDataToServer().execute(url, "PUT", jsonData.toString()).get();有问题吗?
    • 你永远不会得到正确的响应,因为 get 是同步方法并且 asyncTask 异步运行,而是覆盖 asyncTask,挂钩你的代码然后执行该对象
    【解决方案2】:

    在异步任务重写 onPreExecute() 方法中,您必须显示进度条..

    private void signIn(your parameters here) {
            new AsyncTask<Void, Void, Void>(){
    
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                     progressDialog = new ProgressDialog(SignIn.this);
                     progressDialog.setMessage("Sign in in progress");
                     progressDialog.setTitle("Please wait");
                     progressDialog.setCancelable(false);
                     progressDialog.setIndeterminate(true);
                     progressDialog.show();
                }
    
                 @Override
                protected void doInBackground(Void... params) {
                     //your logic here
                }
    
                @Override
                protected void onPostExecute(JSONObject response) {
                     super.onPostExecute(response);
                     progressDialog.dismiss();
                }
              }.execute();
         }
    

    希望这有帮助

    【讨论】:

      【解决方案3】:

      在 Asyntask 中使用您的进度对话框。在 onPreExecute 中初始化并启动您的对话框,并在 onPostExecute 中关闭对话框。 为我工作,

      @Override
      protected void onPreExecute() {
          progress = new ProgressDialog(UpdateActivity.this);
          progress.setCancelable(false);
          progress.setMessage("Please wait data is Processing");
          progress.show();
      }
      @Override
      protected void onPostExecute(Void aVoid) {
          super.onPostExecute(aVoid);
          progress.dismiss();
      
      }
      

      【讨论】:

        【解决方案4】:

        我已经更改了我的代码

         String result = new sendDataToServer().execute(url, "PUT", jsonData.toString()).get();
        

        通过这样做:

        https://gist.github.com/cesarferreira/ef70baa8d64f9753b4da

        现在效果很好。

        感谢您的帮助。 =)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-16
          相关资源
          最近更新 更多