5

私はProgressBarという不確定な値を持つAsyncTaskを持っていますが、通常は非常に速く実行されますが、時にはゆっくり実行されます。認識可能な待機がない場合、プログレスバーがすばやく点滅することは望ましくないことです。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を超えるようにならない限り、ディスプレイを完全に避けたいです。 –

+0

さて、おまえ。それは私にとって今より意味をなさない。あなたのバックグラウンド操作は何ですか? –

+0

私はこの場合別の方法で解決しましたが、将来はダウンロードやCPU集約的な操作などにこれを適用したいと考えています。一部のデバイスやネットワーク接続は、「しばらくお待ちください」ポップアップや他の低速のデバイスの応答を待たずにすばやく応答することがあります。進捗バーの表示を遅らせることで、問題を250 ms先にシフトさせただけではないことを私は確信していません。操作に251ミリ秒かかった場合は、まれにブリンク/グリッチが発生することがありますが、100ミリ秒の遅延を追加すると、少しスムーズに見えるようになり、相対的なパフォーマンスの影響はほとんどありません。 –

4

はい、そこにあり、それがCountDownTimerとその高度利用不足と呼ばれています。タイマーの各ティックごとに、またはタイマーがなくなったときにアクションを起こすことができます。

関連する問題