【问题标题】:How can I show a ProgressBar only after a minimum delay?如何仅在最小延迟后显示 ProgressBar?
【发布时间】:2012-07-21 01:50:30
【问题描述】:

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

有没有办法在不创建另一个嵌套AsyncTask 的情况下延迟显示进度条?

【问题讨论】:

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


    【解决方案1】:

    是的,它被称为CountDownTimer,它的使用率很低。您可以在计时器的每个滴答声或计时器用完时采取行动。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 对不起,这是一个不确定的ProgressBar。我不想创建延迟只是为了让它看起来更令人愉悦,我想完全避免显示,除非延迟开始超过 250 毫秒。
        • 好的,明白了。这对我来说更有意义了。你的后台操作是什么?
        • 在这种情况下,我以另一种方式解决了它,但将来我想将其应用于下载或 CPU 密集型操作等事情。某些设备或网络连接的响应速度可能足够快,以至于不会出现“请稍候”弹出窗口,而其他速度较慢的设备可能会出现。尽管我不相信我们只是通过延迟显示进度条将问题提前 250 毫秒。如果操作花费了 251 毫秒,当然您仍然会出现闪烁/故障,但是添加 100 毫秒的延迟可能会使它看起来更平滑一些,并且不会对性能产生太大影响。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多