如何在最小延迟后显示ProgressBar?

时间:2012-07-21 01:50:31

标签: android android-asynctask progress-bar android-progressbar

我有AsyncTask一个不确定的ProgressBar,通常执行得非常快,但偶尔会很慢。当没有明显的等待时,进度条快速闪烁是不可取的和分散注意力的。

有没有办法延迟显示进度条而不创建另一个嵌套AsyncTask

3 个答案:

答案 0 :(得分:4)

是的,有,它被称为CountDownTimer并且它的使用率极低。您可以在计时器的每个刻度处或计时器用完时采取措施。

答案 1 :(得分:3)

感谢Code Droid,我能够编写一个抽象的AsyncTask类,在指定的延迟后显示一个不确定的进度条。只需扩展此类而不是AsyncTask,并确保在适当时调用super()

public abstract class AsyncTaskWithDelayedIndeterminateProgress
      <Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
   private static final int MIN_DELAY = 250;
   private final ProgressDialog progressDialog;
   private final CountDownTimer countDownTimer;

   protected AsyncTaskWithDelayedIndeterminateProgress(Activity activity) {
      progressDialog = createProgressDialog(activity);
      countDownTimer = createCountDownTimer();
   }

   @Override protected void onPreExecute() {
      countDownTimer.start();
   }

   @Override protected void onPostExecute(Result children) {
      countDownTimer.cancel();
      if(progressDialog.isShowing())
         progressDialog.dismiss();
   }

   private ProgressDialog createProgressDialog(Activity activity) {
      final ProgressDialog progressDialog = new ProgressDialog(activity);
      progressDialog.setIndeterminate(true);
      return progressDialog;
   }

   private CountDownTimer createCountDownTimer() {
      return new CountDownTimer(MIN_DELAY, MIN_DELAY + 1) {
         @Override public void onTick(long millisUntilFinished) { }

         @Override public void onFinish() {
            progressDialog.show();
         }
      };
   }

答案 2 :(得分:0)

我假设您在AsyncTask完成之前至少调用了几次onProgressUpdate。如果是这样的话,你可以做的就是这个。每次调用onProgressUpdate之前,请调用Thread.sleep(250)。这样,您的后台线程将在与UI线程通信之前暂停,并呈现更长时间运行的任务。如果做不到这一点,我可能需要查看您的代码或获取更多信息。