5

我有一個AsyncTask與一個不確定的ProgressBar,通常執行速度非常快,但偶爾會緩慢。當沒有明顯的等待時,進度條快速閃爍,這是不可取的,並且讓人分心。如何在最小延遲後才顯示ProgressBar?

有沒有辦法延遲進度條的顯示而不創建另一個嵌套AsyncTask

回答

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

我假設你在AsyncTask完成之前至少要調用onProgressUpdate至少幾次。如果是這樣的話,你可以做的是這樣的。每次調用onProgressUpdate之前,調用Thread.sleep(250)。這樣,在與UI線程進行通信之前,您的後臺線程將暫停並給出長時間運行任務的外觀。否則,我可能需要查看您的代碼或獲取更多信息。

+0

對不起,這是一個不確定的'ProgressBar'。我不想爲了讓它看起來更加令人愉快而造成延遲,我希望完全避免顯示,除非延遲開始超過250ms。 – 2012-07-21 02:03:20

+0

好的,gotcha。這對我來說更有意義。你的背景操作是什麼? – 2012-07-21 02:12:07

+0

我在這種情況下以另一種方式解決了它,但將來我希望將其應用於下載或CPU密集型操作。某些設備或網絡連接可能會作出足夠快速的響應,以免出現「請稍等」彈出窗口,而其他較慢的窗口可能會出現。雖然我不相信我們還沒有通過延遲進度條的顯示來提前250 ms來解決問題。如果操作耗時251毫秒,當然你仍然會出現閃爍/毛刺,但是如果增加100毫秒的延遲可能會使它看起來更平滑一些,並且沒有太多的相對性能影響。 – 2012-07-21 04:12:58

4

是的,這就是所謂的CountDownTimer,它的使用率很低。您可以在計時器的每個滴答時間或計時器耗盡時採取行動。