我有一个AsyncTask
与一个不确定的ProgressBar
,通常执行速度非常快,但偶尔会缓慢。当没有明显的等待时,进度条快速闪烁,这是不可取的,并且让人分心。如何在最小延迟后才显示ProgressBar?
有没有办法延迟进度条的显示而不创建另一个嵌套AsyncTask
?
我有一个AsyncTask
与一个不确定的ProgressBar
,通常执行速度非常快,但偶尔会缓慢。当没有明显的等待时,进度条快速闪烁,这是不可取的,并且让人分心。如何在最小延迟后才显示ProgressBar?
有没有办法延迟进度条的显示而不创建另一个嵌套AsyncTask
?
感谢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();
}
};
}
我假设你在AsyncTask完成之前至少要调用onProgressUpdate至少几次。如果是这样的话,你可以做的是这样的。每次调用onProgressUpdate之前,调用Thread.sleep(250)。这样,在与UI线程进行通信之前,您的后台线程将暂停并给出长时间运行任务的外观。否则,我可能需要查看您的代码或获取更多信息。
是的,这就是所谓的CountDownTimer,它的使用率很低。您可以在计时器的每个滴答时间或计时器耗尽时采取行动。
对不起,这是一个不确定的'ProgressBar'。我不想为了让它看起来更加令人愉快而造成延迟,我希望完全避免显示,除非延迟开始超过250ms。 – 2012-07-21 02:03:20
好的,gotcha。这对我来说更有意义。你的背景操作是什么? – 2012-07-21 02:12:07
我在这种情况下以另一种方式解决了它,但将来我希望将其应用于下载或CPU密集型操作。某些设备或网络连接可能会作出足够快速的响应,以免出现“请稍等”弹出窗口,而其他较慢的窗口可能会出现。虽然我不相信我们还没有通过延迟进度条的显示来提前250 ms来解决问题。如果操作耗时251毫秒,当然你仍然会出现闪烁/毛刺,但是如果增加100毫秒的延迟可能会使它看起来更平滑一些,并且没有太多的相对性能影响。 – 2012-07-21 04:12:58