5

Ho un AsyncTask con un numero indeterminato ProgressBar che viene eseguito in genere molto rapidamente, ma a volte lentamente. È indesiderato e fastidioso che la barra di avanzamento lampeggi rapidamente quando non c'è un'attesa visibile.Come posso visualizzare un ProgressBar solo dopo un ritardo minimo?

C'è un modo per ritardare la visualizzazione della barra di avanzamento senza creare un altro nidificato AsyncTask?

risposta

3

Grazie a Code Droid, sono riuscito a scrivere una classe astratta AsyncTask che mostra una barra di avanzamento indeterminata dopo un ritardo specificato. Basta estendere questa classe invece di AsyncTask e assicurarsi di chiamare super() se del caso:

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

Suppongo che si stia chiamando suProgressUpdate almeno alcune volte prima che l'AsyncTask sia terminato. Se è così, quello che potresti fare è questo. Ogni volta prima di chiamare suProgressUpdate, chiama Thread.sleep (250). In questo modo il thread di sfondo si interromperà prima di comunicare con il thread dell'interfaccia utente e dare l'aspetto di un'attività più lunga in esecuzione. In caso contrario, probabilmente dovrei vedere il tuo codice o ottenere ulteriori informazioni.

+0

Ci dispiace ma è un indeterminato 'ProgressBar'. Non voglio creare un ritardo solo per farlo apparire più piacevole, voglio evitare del tutto il display a meno che il ritardo non cominci a superare, per esempio, 250 ms. –

+0

Ok, gotcha. Questo ha più senso per me ora. Qual è l'operazione in background? –

+0

In questo caso l'ho risolto in un altro modo, ma in futuro voglio applicarlo a cose come download o operazioni intensive della CPU. Alcuni dispositivi o connessioni di rete potrebbero rispondere abbastanza rapidamente da non garantire un popup di "please wait", e altri potrebbero farlo più lentamente. Anche se non sono convinto che non abbiamo solo spostato il problema 250 ms avanti ritardando la visualizzazione della barra di avanzamento. Se l'operazione ha richiesto 251 ms, ovviamente si otterrebbe ancora il blink/glitch, ma l'aggiunta di un ritardo di 100 ms potrebbe far sembrare un po 'più agevole e non avere il relativo impatto sulle prestazioni relative. –

4

Sì, c'è e si chiama CountDownTimer ed è molto sottoutilizzato. Puoi agire ad ogni tick del timer o quando il timer si esaurisce.

Problemi correlati