PDA

Ver la Versión Completa : [ CONSULTA ] ProgressDialog no se ve en tarea asíncrona por culpa del get().


DaSound
09/02/15, 14:15:27
Buenas a todos.

Resulta que tengo una tarea asíncrona que descarga una serie de imágenes de internet desde una lista de urls que yo le paso previamente.

El tema es que funciona perfectamente, pero quiero mostrar un diálogo de progreso para que no se quede la app congelada hasta su carga, el problema es el siguiente:

Si se hace un ".get()" para obtener los datos de la tarea asíncrona, el progressDialog no se ve, porque el método get para el hilo de la UI, con lo que la deja colgada hasta que termina.

La solución parece ser no utilizar el get, pero no consigo implementar una solución que haga el trabajo sin este método. Por lo que he podido leer, se debería utilizar un callback llamado desde el postExecute, pero no sé porqué, no me sale implementarlo... ¿Alguno lo habéis hecho y os ha funcionado?

Gracias de antemano!!

mocelet
09/02/15, 20:05:38
http://www.sgoliver.net/blog/tareas-en-segundo-plano-en-android-i-thread-y-asynctask/

Concretamente te interesa la parte donde habla del publishProgress, que tendrás que llamarlo cada vez que se baje correctamente un fichero.

Supongo que en el doInBackground tendrás un bucle, en cada iteración llamas al publishProgress con el número de ficheros que llevas.

Y en el onProgressUpdate actualizas la barra de progreso.

DaSound
09/02/15, 21:18:00
Gracias mocelet!!

No tengo barra de progreso, tengo un diálogo que indica que se está procesando el trabajo, no necesito actualizar el porcentaje. Concretamente, mi tarea asíncrona recibe una lista de strings, que son las urls de las imágenes, y devuelve un List<Bitmap> que, efectivamente, es generado en un bucle en el doInBackground()... mi duda es... como lo hago si tengo que devolver un objeto... si la tarea únicamente realizara un trabajo sin tener que recuperar ningún dato era sencillo, porque no tengo que hacer el get(), con el execute me vale y sí se ve el diálogo, pero con el get no... esa es mi duda, como hago el get dentro de la tarea asíncrona y devulevo el objeto List<Bitmap> si solo ejecuto la sentencia "execute" desde la MainActivity.

mocelet
09/02/15, 22:18:32
Vale, no entendía el problema. El resultado te lo da el onPostExecute cuando lo tenga.

Solo necesitas un callback en tu actividad para que el onPostExecute lo llame.

Por no escribir lo mismo, mira la respuesta aceptada http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-a

EDIT: Si tu async task es una clase interna no tienes que andar extendiendo la clase y creando la interfaz, simplemente hacer la llamada desde onPostExecute. Imagino que no es tu caso

DaSound
10/02/15, 21:53:31
Vale, no entendía el problema. El resultado te lo da el onPostExecute cuando lo tenga.

Solo necesitas un callback en tu actividad para que el onPostExecute lo llame.

Por no escribir lo mismo, mira la respuesta aceptada http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-a

EDIT: Si tu async task es una clase interna no tienes que andar extendiendo la clase y creando la interfaz, simplemente hacer la llamada desde onPostExecute. Imagino que no es tu caso

Exactamente, ese era el problema... con esa respuesta que me has enviado le he dado solución... muchas gracias por todo compañero!