Arreglando chapuzas en Android (un caso práctico)

Desviándome un poco de mi trabajo de estos últimos meses, me han pedido ayuda técnica en una aplicación Android.

Os pongo en situación: la aplicación llama a un WS pidiendo 300 objetos a actualizar, parsea el resultado, lo transforma a objetos, inserta/actualiza y vuelve a ver si hay más resultados (y repite el proceso si es así). Hay muchos resultados (+4000) por lo que tarda 105 segundos! En un Nexus 5. Y hay más objetos a actualizar!

Es una barbaridad de tiempo pero tienen la suerte de que los usuarios necesitan la aplicación por lo que pacientemente esperan hasta que termina la actualización (que se repite cada 2-3 meses). También les sirve de consuelo la cantidad de aplicaciones que hacen esperar esos tiempos para actualizaciones de datos u otras cosas que podrían ser hechas en el backend (Skype, te miro a ti).

Veamos a ver lo que puedo hacer sin cambiar drásticamente el enfoque (rock-the-boat no permitidos):

Los 13 segundos actuales se desglosan en las siguientes operaciones:

Pero, en el camino de la eficiencia me he cargado la aplicación de una regex para quitar caracteres erróneos, tengo que volver a incluirlo:

Resultado final: 5 segundos… partiendo de 105.

Mi enfoque siempre ha sido ver lo que tarda más (con DDMS, trace y código) y atacar, teniendo en cuenta los mensajes del GC en el log. El resultado final también han sido 60 líneas de código menos (en 132 se ha quedado).

Hay más mejoras posibles (en SO hay un listado curioso) pero de momento así se queda, esperando feedback del resto del equipo.

Nada más, estoy abierto a cualquier sugerencia! (seguro que se me ha pasado algo) 😀