Android 在 onClick 方法结束之前不会显示进度对话框

Android Progress dialog don't show until the end of onClick method

我正在尝试在单击登录按钮时显示进度对话框。但是只有当我到达 onClick 方法的末尾时,才会显示进度对话框。而不是一个开始。 在 signIn 方法中,我执行一个异步任务来访问服务器。 所以一直由异步任务占用,没有显示进度对话框。只有当到达 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();
        }

非常感谢

纳丁

您需要将它放在 AsyncTaskonPreExecute 中,而不是在 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();
  }
}

在异步任务中重写 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();
     }

希望这有帮助

在 Asynctask 中使用进度日志。在 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();

}

我已经更改了我的代码

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

通过这样做:

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

现在效果很好。

感谢您的帮助。 =)