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();
}
};
}
fonte
2012-07-27 19:43:13
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. –
Ok, gotcha. Questo ha più senso per me ora. Qual è l'operazione in background? –
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. –