2011-04-07 9 views
5

Mi AsyncTask bloquea el elemento de bloque de bloqueo mientras se muestra la imagen descargada y el diálogo de progreso se muestra con retraso: muestra por un tiempo antes de mostrar la imagen, pero la descarga tarda mucho tiempo y el botón está bloqueado (naranja) y no se muestra el diálogo.AsyncTask bloquea el subproceso UI y muestra la barra de progreso con demora

public Bitmap download(String url, ProgressBar progressbar) throws InterruptedException, ExecutionException { 
    BitmapDownloaderTask task = new BitmapDownloaderTask(progressbar); 
    task.execute(url); 
    return task.get(); 
} 

class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { 



    public BitmapDownloaderTask(ProgressBar progressbar) { 

    } 
    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(ShowActivity.this); 
     dialog.setMessage("Loading"); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 

    @Override 
    protected Bitmap doInBackground(String... Params) { 
     return imageLoader.getBitmap(params[0]); 

    } 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     dialog.dismiss(); 


    } 
}  

en el botón oyente, simplemente llame a la función de descarga, el parámetro de progreso es porque tengo círculo barra de progreso en imageview - el diálogo es solo para probar, para fundar ¿por qué existe el retraso y el bloque. En otra aplicación, uso runable y thread y element no está bloqueado, pero en tutoriales se menciona AsyncTask como la mejor solución para esto.

+0

esta es la forma correcta de hacerlo, consulte este enlace: http: //www.android-ios-tutorials.com/ 182/show-progressbar-while-downloading-image-using-asynctask-in-android/ – Houcine

Respuesta

13

La descarga de la imagen se ejecuta efectivamente en el hilo de fondo, pero con return task.get(); está esperando que termine, y eso es lo que está bloqueando su hilo principal.

Debe utilizar onPostExecute() como una devolución de llamada para cuando la tarea haya finalizado, por lo tanto, no solo para cerrar el cuadro de diálogo sino también para hacer lo que necesita con el mapa de bits devuelto por doInBackground().

+0

¡Muchas gracias por la explicación! – Dupla

+0

Gracias por su sugerencia de ahorro de días –

2

Es porque se está llamando AsyncTask#get:

Waits si es necesario para el cómputo para completar, y después recupera su resultado.

Debe realizar cualquier operación que necesita para utilizar la imagen en el plazo de onPostExecute()

+0

Esa descripción, directamente de la documentación de Android, podría ser un poco más clara que "esperar" en un sentido técnico donde "nada puede suceder en el hilo de llamada, por ejemplo, actualizaciones de UI". –

Cuestiones relacionadas