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

Respuesta
 
Herramientas
  #1  
Viejo 18/03/15, 15:40:48
Array

[xs_avatar]
Barzon Barzon no está en línea
Usuario poco activo
 
Fecha de registro: mar 2015
Mensajes: 2
Modelo de smartphone: GT-I9515L
Tu operador: Movistar
[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
Responder Con Cita


  #2  
Viejo 18/03/15, 16:15:49
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

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!
Responder Con Cita
  #3  
Viejo 18/03/15, 20:39:25
Array

[xs_avatar]
Barzon Barzon no está en línea
Usuario poco activo
 
Fecha de registro: mar 2015
Mensajes: 2
Modelo de smartphone: GT-I9515L
Tu operador: Movistar
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...
Responder Con Cita
  #4  
Viejo 18/03/15, 21:07:17
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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.
Responder Con Cita
Gracias de parte de:
  #5  
Viejo 18/03/15, 21:34:53
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

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!
Responder Con Cita
Gracias de parte de:
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android

Herramientas


Hora actual: 14:19:15 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /