entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Android AsyncTask en una clase separada.

Buenos días compañeros programadores, tengo una duda en cuanto a las tareas asíncronas. Como se debe implementar correctamente un asynctask en una clase separada ¡?

pondré un ejemplo con el cual me eh dado golpes de cabeza sin poder resolver.. (y tengo que poner un montón de código en la clase para que funcione, esto esta muy mal)

1.- tengo un Activity
dentro del activity tengo 2 spinners, uno de ESTADOS y otro de MUNICIPIOS.

2.- La primer asynctask debe llenar el primer spinner
3.- la segunda asynctask necesita un ID del primer spinner para que funcione

Si lo hago todo en la misma clase (como lo eh echo hasta ahora), no hay ningún problema, pero como puedo hacer esto en clases separadas para tener mas limpio mi código.???

3 Respuestas

-1voto

Novus Ordo Seclorum Puntos4810

2votos

Leonardo-Tadei Puntos227320

Hola Novo,

la repuesta desde la POO a tu pregunta es que tenés que tener un método en la clase que trae los municipios que reciba como mensaje el estado seleccionado... posiblemente estés pensando las clases como si fueran funciones en vez de pensarlas como lo que son: moldes o plantillas para instanciar Objetos.

En pseudocódigo:

clase WidgetEstado:
   getEstados(){ ...
   ...

clase WidgetMunicipio:
   getMunicipios(unEstado){...
   ...

Incluso esto es generalizable:

clase Widget:
   getValores(tipoValor, referencia){...
   ...

en donde tipoValor es la cosa que te hace falta recibir (Estados o Municipios en tu caso) y referencia es la condición de referencia para trae un subconjunto, que si es nulo significará que se traen todos.

Las clases tendrán un método para setear el spinner a llenar para que los get lo usen más tarde y detalles por el estilo.

Volviendo al purismo de la POO, los mensajes de los métodos deberían ser una instancia de la cosa a traer, pero a veces por comodidad se le envía el ID y un string con el nombre de la clase por ejemplo. Son atajos válidos, pero un desmadre de estos atajos termina convirtiendo el código en basura, es decir, que falla más y que es difícil de entender y de mantener.

Saludos!

0voto

Novus Ordo Seclorum comentado

Pero con un asynctask esto como funiciona ??

desde mi activity mando llamar mi Asynctask asi en el metodo OnCreate

spinner_estado = (Spinner) findViewById(R.id.spinner_estado);

// hace la consulta para traer los estados.
asyncEstados = new GetEstados();
asyncEstados.execute("");

Los metodos de la Task son:

1.- doInBackground
2.- onPostExecute

el doInBackground, me regresa un Array con los nombres de los estados.... estos deberian ser devueltos al Activity para llenar el spinner, como rayos se hace estooo :( !! creo que debi poner mas atencion a las clases en mi universidad de POO....

espero no causar molestias con mis preguntas u.u

0voto

Leonardo-Tadei comentado

Hola Novo!

funciona tal y como decís!!! Lo que tenés que tener en cuenta es que tu clase hereda de AsyncTask, lo que significa que tendrá por herencia su comportamiento, pero esto no quiere decir que vos no puedas implementar más métodos para usarla como más te convenga.

Me resulta confuso el nombre que elegiste para la clase: GetEstados es más un nombre de un método que el de una clase! Esto refuerza mi sospecha de que estás pensando las clases como funciones.

De la forma en que te propongo, el uso sería (perdón, pero te voy a cambiar el nombre de la clase):

spinner_estado = (Spinner) findViewById(R.id.spinner_estado);

// hace la consulta para traer los estados.
asyncEstados = new WidgetEstado();
asyncEstados.setSpinner(spinner_estado);
asyncEstados.execute("");

Incluso se le podría dar una mejor semántica implementando un método getEstados() que lo único que hace es llamar a this.exceute("")

Esto es para tener dos clases distintas para manejar Estados y Municipios. La versión generalizada tiene un mensaje más y justifica la implementación del getValores() que llama al execute().

PD: no sé si debiste prestar más atención a las clases de POO, porque yo no daba esas clases... en cuyo caso la respuesta era un rotundo sí ;-)

1voto

manelcc Puntos580

Saludos,

mi pregunta sería porque utilizas tareas en segundo plano para rellenar un spinner. El spinner debería rellenarse:

  • en recurso string un array de estados.
  • si lo que quieres es obtener los datos desde un servidor de internet entonces si que utilizaría una tarea en segundo plano (Asyntask) pero debes 1) conectar 2) convertir 3) mostrar.
    Realmente lo que realizaría sería incorporar los spinner en la activity y que se muestre solamente el spinner Estado y este oculto el spinner Municipio.
    En cuanto se selecciona un item del Spinner Estado (este se pasara como parametro hacia un metodo para tratar el spinner Municipio), se volvera visible el Spinner Municipio y al recibir el parámetro mostrara los municipios correspondientes del Estado seleccionado.
    Con esto ahorraras memoria y consumo de recursos.
    SÍNTESIS
    Guardar como array los Estados en los recursos android.
    Guardar como array los Municipios en los recursos android.
    Crear el adaptador entre los Estados y municipios.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta