Respuesta

3

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(); 
     } 
     }; 
    } 
0

Supongo que está llamando al progresoUpdate al menos unas pocas veces antes de que finalice su AsyncTask. Si ese es el caso, lo que podrías hacer es esto. Cada vez que llame aProgressUpdate, llame a Thread.sleep (250). De esta forma, el hilo de fondo se detendrá antes de comunicarse con el hilo de la interfaz de usuario y dará la apariencia de una tarea más larga. De lo contrario, probablemente necesite ver su código u obtener más información.

+0

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. –

+0

De acuerdo, tengo. Eso tiene más sentido para mí ahora. ¿Cuál es tu operación de fondo? –

+0

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. –

4

Sí, la hay y se llama CountDownTimer y está muy poco utilizada. Puede tomar medidas en cada tic del temporizador o cuando el temporizador se agote.

Cuestiones relacionadas