Acceder

Ver la Versión Completa : Arrayadapter con asyntask


jamercues
08/07/15, 16:35:56
Hola a todos.

Hace unos meses me contrataron como programador en una empresa para desarrollar aplicaciones en Android, es la primera vez que trabajo de programador Android y tengo algunas dudas/problemillas

El caso es, que cuando abro otro activity, por ejemplo, en este caso, abró contactos, y me carga más de 2.000 registros, como podéis imaginar y me investigado, solo puedo ocupar 30mb de RAM y le cuesta unos 3 segundos en cargar el activity, mi pregunta es, hay alguna manera para que en vez de que se quede la pantalla en blanco, poner algún tipo de progressdialog o similar? Aunque sea un menaje estático que ponga cargando, pero quiero evitar la pantalla el blanco y que quede feo.

Por ahora, había probado con el asyntask, pero no he sabido, me da error, por lo de que no puedo modificar activitys desde otra clase.

A ver si me pueden ayudar.

Gracias!

Pdt. Preguntaría en mi trabajo, pero estoy yo solo y nadie sabe programar en android, mi experiencia era la del colegio, he sufrido en según que cosas, pero por ahora he superado todos los obstáculos

Dexafree
08/07/15, 17:01:29
Hace unos meses me contrataron como programador en una empresa para desarrollar aplicaciones en Android, es la primera vez que trabajo de programador Android

Como ya se comentó en otro hilo, lo sorprendente es que hayan contratado a alguien como desarrollador Android si no tiene experiencia


Por lo demás, podrías

1. Limitar el número de contactos que cargas (necesitas mostrar los 3000 de tirón?)
2. En realidad si podrías modificar una Activity desde una AsyncTask, pasando una referencia a la Activity (no es bonito pero poder se puede)
3. Tu mismo ya dices lo del ProgressDialog

kriogeN
08/07/15, 18:55:13
Como ya se comentó en otro hilo, lo sorprendente es que hayan contratado a alguien como desarrollador Android si no tiene experiencia


Por lo demás, podrías

1. Limitar el número de contactos que cargas (necesitas mostrar los 3000 de tirón?)
2. En realidad si podrías modificar una Activity desde una AsyncTask, pasando una referencia a la Activity (no es bonito pero poder se puede)
3. Tu mismo ya dices lo del ProgressDialog

Respecto a la primera frase, +200.000, supongo que es lo típico de una Startup que busca programadores baratos en lugar de programadores experimentados. Luego el producto fracasa y no saben porque ha sido...

En cuanto al tema en cuestión, supongo que te refieres a los contactos de la agenda del móvil, en ese caso tengo que decirte que poco puedes hacer. Porque lo que tarda no es en rellenar el Adapter (he llegado a rellenar 30.000 contactos de la agenda y no se resiente en tiempo), lo que tarda es en rellenar el Cursor del ContactsContract, en el caso de 30.000 contactos me tarda 1 minuto más o menos. Es un problema bastante comentado en los foros de Android y que lleva sin resolverse desde Donut.

Lo que hago cuando me tengo que enfrentar a ese problema es hacerlo nada mas iniciar la aplicación en un hilo, y almacenar los contactos en un SQLite de la aplicación, en ese caso recorrer los 30.000 contactos del SQLite le lleva muchísimo menos tiempo. Cada vez que se abre la apliación repito el proceso, por si acaso hay contactos nuevos y hay que actualizar el SQLite.

En cuanto a la mejor forma de resolver el problema de rellenar el Adapter, lo que yo haría sería poner un "Loading Spinner" (un círculo que da vueltas) al RecyclerView (o ListView) y mostrarlo mientras en segundo plano (en un AsyncTask como has comentado, por ejemplo) obtener los contactos, una vez los tenga hacer el notifyDataSetChanged y mostrar los datos en su lugar.

jamercues
08/07/15, 23:31:14
Gracias por contestar.

Los contactos no son los del móvil, los recibió desde el navision y los tengo en la base de datos del móvil, previa sincronización también.

Sobre que me hayan contratado, pues yo estoy contento y en general están contentos conmigo, stackoverflow me esta ayudando mucho.

Mañana miraré lo que comentas y a ver si consigo poner un mensaje o el progressdialog (que lo he intentado sin éxito, el que da vueltas, lo tengo en el login por ejemplo) aunque creó que me has dado a entender que es un problema que viene de muchas versión anteriores, quizás ponga en la sql un límit de 100 o 200, total, no creo que vayan contacto a contacto mientras tienen un buscador para buscar el contacto, pienso yo vamos, de todo hay en este mundo.

Decir, que ya ha pasado gente antes de mi por ese puesto y ya había proyectos donde he aprendido, pero hay muchas cosas que he corregido en la aplicación que estoy haciendo ahora porque me parecía que estaba mal, casi seguro vamos y no por no tener experiencia tiene que salir mal, el tema esta en ser insistente y que te guste tu trabajo, ami me gusta muchísimo más que en el que estaba antes, que tenía contrato fijo y lo deje por este con un contrato de menor tiempo, pero creo que he hecho un buen cambio

jamercues
09/07/15, 16:44:29
No lo he conseguido, por algún causal, te refieres a ejecutar el asyntask vacío sin que haga nada? Por ejemplo, un do while de un booleano y que cambie cuando termine?

Esto se me acaba de ocurrir

pozako
10/07/15, 13:03:53
Lo ideal sería usar AsyncTask y meter todo el procedimiento de rellenar el array en el método doInBackground() y en el método onPreExecute() inicializar la vista que vas a poner al frente mientras se va a realizar en segundo plano la tarea y ya dependiendo de si esa vista fuera por ejemplo una barra de progreso y tuviera que ir actualizándose ya deberías de usar el método onProgressUpdate() para ir avanzando el progreso en la vista actual.