|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
[Consulta] Como planteo mis clases en Android? AsyncTask?
Hola, mi consulta es super simple.
Estoy desarrollando una aplicacion que cargue imagenes de un listado obtenido desde una url con un recurso JSON. El problema es que tengo una duda con respecto al AsyncTask, cada clase que quiera llevar algo a la UI debe ser basada en un AsyncTask? Puedo crear una AsyncTask que haga los llamados a todas las clases y este envíe los resultados a la UI? O debo crear una AsyncTask dentro de cada clase que haga conexion para cargar y/o mostrar imagenes en la UI? Eso. Tengo esas consultas y dudas, ya que solo he desarrollado en Web y Desktop, pero el tema de Android es nuevo para mí. Gracias |
|
#2
|
||||
|
||||
No te compliques la vida con las AsyncTask, para cargar imágenes y ponerlas en una ImageView hay bibliotecas que hacen todo el trabajo sucio, como p.ej. https://github.com/koush/ion
Le dices la URL, el identificador del ImageView donde quieres mostrarlo y listo.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
#3
|
||||
|
||||
Muchas Gracias, pero la idea es aprender a hacerlo...
Por eso mi consulta, como debo re plantear las clases y en que parte debo usar o no usar AsyncTask... |
#4
|
||||
|
||||
Para tareas de comunicación de red hay muchas librerías que te evitarán usar AsyncTask, por ejemplo (y la que uso yo) Volley, que es la librería oficial de Google, te permite comunicaciones HTTP de cualquier tipo y de descarga de imágenes (con cache en memoria o en disco incluido) como si trabajases en primer plano, olvidándote que de hecho la librería va a hacer un trabajo en segundo plano.
Ahora con respecto a tu pregunta ¿Cuando usar AsyncTask? La respuesta es el menor número de veces posible, sobre todo si van a coexistir varios AsyncTask al mismo tiempo. Por ejemplo para el registro GCM (si alguien ha encontrado la forma de poderlo hacer sin AsyncTask que me lo diga, pero el API de Google en síncrono y en Android Developers el ejemplo lo hacen con AsyncTask), que es una tarea de red (por lo tanto debe ir fuera del UI) pero no puedes resolverlo con Volley. Otro caso de uso de AsyncTask es por ejemplo leer los contactos del móvil, si tienes muchos contactos en el móvil es una tarea que puede durar perfectamente 2 o 3 minutos. Así que generalmente, para registro GCM y para tareas que pueden ser extremadamente largas y por tanto bloquear el UI y que salga el cartel de Forzar cierre o Esperar. |
Gracias de parte de: | ||
#5
|
||||
|
||||
El concepto fundamental es que cuando quieras tocar algo de la interfaz de usuario (UI) tienes que hacerlo desde el hilo principal (main thread o UI thread), que es el que se encarga de dibujar en pantalla y gestionar la interacción con el usuario.
Precisamente porque es el hilo que dibuja la pantalla (60 veces por segundo), y registra las pulsaciones del usuario, no puede bloquearse. Si ejecutas algo que tarde aunque sea un segundo en el hilo principal, dejas el móvil tostado un segundo porque no podrá atender a eventos. Y si en vez de un segundo son varios, Android matará la aplicación (y te dirá que hubo un error del tipo ANR: Application Not Responding) Pedir una imagen a un servidor puede llevar más o menos tiempo, así que hay que hacerlo en otro hilo que se ejecute en "background" o en segundo plano, o como quieras llamarlo. Ese hilo se encargará de hacer la petición al servidor, recibir el fichero jpg/png/..., descodificarlo, cambiar la resolución si hace falta y convertirlo en un objeto Bitmap (un mapa de bits que luego podrás meter en un ImageView). De paso tocar madera con los Bitmap porque o se hace muy bien o es fácil caer en el famoso OutOfMemoryException porque la memoria de bitmaps es muy limitada. Todo eso (conectar, bajar fichero, convertir a Bitmap) lo hará un método que se ejecutará en segundo plano para no bloquear la interfaz de usuario. Esto puedes hacerlo bien ejecutándolo dentro de una AsyncTask (y el método no sabe nada de hilos, simplemente hace su trabajo) o bien porque abras un hilo independiente y se comunique con el hilo principal enviando un Runnable con el método post (viene a ser muy a grandes rasgos lo que hace una AsyncTask por dentro). Tienes las dos opciones explicadas en la documentación de Android, casualmente con un ejemplo de descarga de imágenes: http://developer.android.com/guide/c...d-threads.html Ahora, ese Bitmap lo tienes que pasar a una ImageView con setImageBitmap para poder mostrarlo. Eso tienes que hacerlo desde el hilo principal. Si has usado el AsyncTask tendrás que actualizar el ImageView dentro del onPostExecute (que siempre se ejecuta en el hilo principal y existe precisamente para modificar la UI con los resultados de la tarea ejecutada). Si en su lugar le pasaste un Runnable a la ImageView, el runnable permanecerá en una cola y cuando el hilo principal pueda lo ejecutará y actualizará la view. En el caso concreto de las imágenes son muchos quebraderos de cabeza en una app en producción, usa una biblioteca. Hasta Google creó Google Volley para evitar esos problemas... http://developer.android.com/training/volley/index.html EDIT: Se me debió ir el santo al cielo, me adelantó kriogeN
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
Gracias de parte de: | ||
![]() |
![]() |
||||||
|