我有一個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