cevap

3

Code Droid sayesinde, belirli bir gecikme sonrasında belirsiz bir ilerleme çubuğu gösteren bir soyut AsyncTask sınıfı yazabildim. Hemen yerine AsyncTask bu sınıfını genişletmek ve uygun olduğunda super() aramak emin olun:

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'ın bitmeden en az birkaç kez onProgressUpdate'i çağıracağınızı kabul ediyorum. Eğer durum buysa, bunun yapabileceği şey budur. OnProgressUpdate'i çağırmadan önce her defasında Thread.sleep (250) numaralı telefonu arayın. Bu şekilde arka plan iş parçacığınız, kullanıcı arabirimi iş parçacığı ile iletişim kurmadan önce duraklar ve daha uzun bir çalışma görevinin görünümünü verir. Başarısız olursanız, muhtemelen kodunuzu görmem veya daha fazla bilgi almam gerekir.

+0

Maalesef, bu belirsiz 'ProgressBar' var. Sadece daha hoş görünmesini sağlamak için bir gecikme yaratmak istemiyorum, gecikme geçmediği sürece, ekran 250 ms. –

+0

Tamam, yakaladım. Bu şimdi bana daha mantıklı geliyor. Arkaplan operasyonun nedir? –

+0

Bu durumda başka bir şekilde çözdüm, ancak gelecekte indirmeler veya CPU yoğun operasyonlar gibi şeylere uygulamak istiyorum. Bazı cihazlar veya ağ bağlantıları, "lütfen bekleyin" açılır penceresini ve diğer daha yavaş olanları garanti etmeyecek kadar hızlı yanıt verebilir. Her ne kadar ben ilerleme çubuğunun görüntülenmesini geciktirerek sorunu 250 ms ileride değiştirmediğimize ikna olmama rağmen. Operasyon 251 ms sürdüyse, elbette hala göz kırpma/aksaklık elde edersiniz, ancak 100ms'lik bir gecikme eklemek biraz daha yumuşak görünebilir ve göreli performans etkisine sahip olmayabilir. –

4

Evet, buna CountDownTimer deniyor ve yüksek oranda kullanılıyor. Zamanlayıcının her işaretinde veya zamanlayıcı tükendiğinde harekete geçebilirsiniz.