Android asynctask显示进度对话框,直到函数完成

Android asynctask显示进度对话框,直到函数完成,android,android-asynctask,Android,Android Asynctask,我知道这个答案已经被回答了多次,但我无法让它正常工作。它从活动A开始,用户需要通过函数authenticate登录。当用户点击登录按钮时,我希望progressdialog出现,直到函数authenticate得到响应。成功后,您可以转到另一个活动,在该活动中您可以浏览应用程序。。不管怎样,有时当互联网速度很慢或者你在移动互联网上时,我仍然会看到活动A在几秒钟内什么也不做,而auth功能正在运行。完成后,系统跳到活动B 我试过使用睡眠线程之类的东西,但这不是重点。。我希望progressdial

我知道这个答案已经被回答了多次,但我无法让它正常工作。它从活动A开始,用户需要通过函数authenticate登录。当用户点击登录按钮时,我希望progressdialog出现,直到函数authenticate得到响应。成功后,您可以转到另一个活动,在该活动中您可以浏览应用程序。。不管怎样,有时当互联网速度很慢或者你在移动互联网上时,我仍然会看到活动A在几秒钟内什么也不做,而auth功能正在运行。完成后,系统跳到活动B

我试过使用睡眠线程之类的东西,但这不是重点。。我希望progressdialog在用户点击login时出现,在auth函数完成时消失

在AsyncTask的帮助下,我有时会在一瞬间看到对话框,但不会看到它应该是什么样子。。我还想使用asynctask加载我的ListView,但是对话框没有完成它应该做的事情

这里是我的异步任务代码

public class HeavyWorker extends AsyncTask<String, Context, Void> {

private ProgressDialog dialog;

public HeavyWorker() {
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    dialog = new ProgressDialog(AuthenticationActivity.this);
    dialog.setMessage("Gettting data");
    dialog.setIndeterminate(true);
    dialog.setCancelable(false);
    dialog.show();
}

@Override
protected Void doInBackground(String... params) {
        authenticate(username, password, autoLogin);

    return null;
}

@Override
protected void onPostExecute(Void result) {
    if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
    }
}
非常感谢您提供的任何帮助或建议。

为您提供了一个很好的示例:您可以在
onProgressUpdate(…)
中发布进度,并可以通过
publishProgress(inti)
doInBackground
进行更新

私有类下载文件任务扩展异步任务{
受保护的长doInBackground(URL…URL){
int count=url.length;
长totalSize=0;
for(int i=0;i
验证成功后,您是否完成活动A?在这种情况下,您可以跳过onPostExecute

在活动中调用HeavyWorker的位置?我想
authenticate
方法是非阻塞的?如果是这样的话,
AsyncTask
将立即返回,您只能从自定义对话框中的按钮上看到
ProgressDialog
onClickListener的闪烁。非阻塞是什么意思?我是说它异步执行身份验证?如果是这样,程序执行没有等待方法完成并从
doInBackground
返回,或者身份验证只是返回得非常快,您可以尝试在doInBackground中插入一个Thread.sleep,只需查看ProgressDialog
dialog.setUndeterminate(true)您的意思是在onProgressUpdate中显示对话框吗?这不起作用。是,当身份验证成功时,活动B将处于活动状态。新的intent函数也在authenticate函数中被调用。这实际上起作用,直到您按下活动B上的back键并再次转到活动A,并且对话框仍然处于活动状态。是的,我知道。但是,当身份验证成功时,是否调用ActivityA.finish()?在这种情况下,您不需要调用dialog.disease(),因为当活动为“die”时,dialog将“die”tooOk,这就是我的意思
builder.setTitle(R.string.dialog_authenticate)
                .setIcon(R.drawable.ic_launcher)
                .setView(viewInflater)
                .setPositiveButton(R.string.dialog_button_login,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                EditText ETusername = (EditText) viewInflater.findViewById(R.id.username);
                                EditText ETpassword = (EditText) viewInflater.findViewById(R.id.password);

                                CheckBox optionAutoLogin = (CheckBox) viewInflater
                                        .findViewById(R.id.autoLogin);

                                checkAutoLogin = 0;
                                if (optionAutoLogin.isChecked()) checkAutoLogin = 1;
                                username = ETusername.getText().toString();
                                password = ETpassword.getText().toString();

                                new HeavyWorker().execute();
                                //authenticate(ETusername.getText().toString(), ETpassword.getText().toString(), checkAutoLogin);
                            }
                        })
   private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         //DO YOUR PROGRESSBAR THINGS HERE
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }