5

通常は非常に高速に実行されますが、場合によっては低速で実行AsyncTaskされる不確定ながあります。ProgressBar識別可能な待機がないときにプログレスバーがすばやく点滅することは望ましくなく、気が散ります。

別のネストされたものを作成せずにプログレスバーの表示を遅らせる方法はありAsyncTaskますか?

4

3 に答える 3

4

はい、あります。これはCountDownTimerと呼ばれ、十分に活用されていません。タイマーのティックごと、またはタイマーが切れたときにアクションを実行できます。

于 2012-07-21T02:24:34.603 に答える
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();
         }
      };
   }
于 2012-07-27T19:43:13.373 に答える
0

AsyncTaskが終了する前に、少なくとも数回onProgressUpdateを呼び出していると想定しています。その場合、あなたができることはこれです。onProgressUpdateを呼び出す前に、毎回Thread.sleep(250)を呼び出します。このようにして、バックグラウンドスレッドはUIスレッドと通信する前に一時停止し、実行時間の長いタスクのように見えます。それができない場合は、おそらくあなたのコードを見るか、さらに情報を入手する必要があります。

于 2012-07-21T02:00:54.913 に答える