Gracias a Code Droid, pude escribir una clase abstracta AsyncTask
que muestra una barra de progreso indeterminada después de un retraso especificado. Sólo extender esta clase en lugar de AsyncTask
y asegúrese de llamar super()
cuando sea apropiado:
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();
}
};
}
Lo siento, es una indeterminada 'ProgressBar'. No quiero crear un retraso solo para que parezca más agradable, quiero evitar la pantalla por completo a menos que el retraso comience a exceder, digamos, 250 ms. –
De acuerdo, tengo. Eso tiene más sentido para mí ahora. ¿Cuál es tu operación de fondo? –
Lo resolví de otra manera en este caso, pero en el futuro quiero aplicar esto a cosas como descargas o operaciones intensivas de CPU. Algunos dispositivos o conexiones de red pueden responder con la suficiente rapidez como para no garantizar una ventana emergente "por favor espere", y otros más lentos. Aunque no estoy convencido de que no hayamos cambiado el problema 250 ms adelante al retrasar la visualización de la barra de progreso. Si la operación duró 251 ms, por supuesto todavía obtendría el parpadeo/falla, pero luego agregar una demora de 100ms podría hacer que se vea un poco más suave y no tenga el mismo impacto de rendimiento relativo. –