AsyncTask bloquea el subproceso de UI y muestra la barra de progreso con retardo

Mi AsyncTask está bloqueando el elemento del botón de bloque mientras se muestra la demostración de la imagen y el diálogo de progreso con retardo – sus demostraciones durante un tiempo antes de que se muestre la imagen, pero la descarga tarda mucho tiempo y el botón está bloqueado (naranja) y el diálogo no se muestra.

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 de escucha, simplemente llamar a la función de descarga, el parámetro de progreso es porque tengo el círculo de la barra de progreso en la vista de la imagen – el diálogo es para la prueba sólo, para encontrar por qué hay el retraso y el bloqueo. En otra aplicación uso runable y hilo y elemento no está bloqueado, pero en tutoriales es AsyncTask mencionado como mejor solución para esto.

La descarga de imágenes se ejecuta de hecho en el subproceso de fondo, pero con return task.get(); Sólo estás esperando que termine, y eso es lo que está bloqueando tu hilo principal.

Debe utilizar onPostExecute() como una devolución de llamada para cuando la tarea ha terminado, por lo que no sólo para descartar el diálogo, sino también para hacer lo que necesita con el mapa de bits devuelto por doInBackground() .

Es porque estás llamando AsyncTask#get :

Espera si es necesario para completar el cálculo, y luego recupera su resultado.

Debe realizar cualquier operación que necesite para usar la imagen para dentro de onPostExecute()

  • Cómo hacer una pantalla de bien codificada de bienvenida
  • Tarea asíncrona versus servicio para descargar datos
  • ¿Necesita ayuda para descargar imágenes de fondo en Android?
  • ¿Qué sucede en Activity.finish () con AsyncTask todavía en ejecución en segundo plano?
  • Repetir AsyncTask
  • Cancelar AsyncTask después de algún tiempo
  • Inicie AsyncTask desde otro AsyncTask doInBackground ()
  • Clase de BlackBerry equivalente a AsyncTask?
  • Asíntase múltiple de una actividad
  • ¿Qué puede hacer que un AsyncTask no se ejecute?
  • ¿Por qué androide logcat no muestra el seguimiento de la pila para una excepción de tiempo de ejecución?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.