Android asynctask显示进度对话框,直到功能完成

时间:2014-03-20 08:18:42

标签: android android-asynctask

我知道这个答案已经多次回答,但我无法让它正常工作。它以活动A开始,用户需要通过功能身份验证登录。当用户点击按钮登录时,我希望progressdialog出现,直到函数authenticate得到响应。成功的同时你去另一个可以在应用程序中导航的活动..无论如何,有时当互联网很慢或者你在移动互联网上时,我仍然看到活动A几秒钟,当auth功能正在进行时什么都不做上。完成后,系统跳转到活动B.

我尝试使用睡眠线程,但这不是重点..我希望在用户点击登录时显示progressdialog,在auth功能完成时显示消失。

在AsyncTask的帮助下,我有时会看到一秒钟的对话框,但不是应该如何...我还想使用asynctask来加载我的列表视图,但对话框并没有做它应该做的事情。

这是我的AsyncTask代码

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();
    }
}

}

我称之为asynctask

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);
                            }
                        })

感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:1)

您是否在认证成功时完成了活动A?在这种情况下,您可以跳过onPostExecute

答案 1 :(得分:0)

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

   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");
     }
 }