Developing Frogtek

El blog del Departamento de Tecnología

Eficiencia en Android

Continuamos con nuestro afán por tener una aplicación más eficiente e iremos escribiendo con lo que nos vamos encontrado: tenemos una tabla con datos para sincronizar y mientras se sincronizan actualizamos una barra de progreso en la status bar. Actualmente, actualizábamos la barra de progreso cada vez que se procesaba una fila, con lo cual, actualizábamos la barra de progreso tantas veces como filas teniamos.

Julio (QA) al percatarse de que esta operación costaba mucho tiempo, lanzó su herramienta más preciada…, el traceview. Se pasó por mi mesa y vimos que la clase Notify de Android se nos estaba llevando un gran tiempo debido al problema explicado en el párrafo anterior.

Con lo que nos pusimos manos a la obra y escribimos el correspondiente método estático que nos calcula el porcentaje y nos dirá si tenemos que actualizar la progress bar, de este modo siempre la actualizaremos 100 veces. Ahí va:

/*** This method retuns true if an update is needed in the progess bar
 *
 * @param itemsCount The total number of items
 * @param iCount The actual item to be processed
 * @return True if is necesary to update the progress bar
 */
 public static boolean isNeededProgressBarUpdate(int itemsCount, int iCount) {
    if (itemsCount != 0 && iCount !=0) {
        int perActual = (iCount * 100) / itemsCount;
        int perPrevious = ((iCount - 1) * 100) / itemsCount;
        if (perActual == perPrevious) {
            return false;
        } else {
            return true;
        }
    } else {
       return true;
    }
 }

Por otro lado también hemos notado que el Log de Android consume bastantes recurso y así lo comentan en la documentación. Pero no tenemos muy claro qué pasa con el Log.d (DEBUG). Según dice en la documentación, no se escribe en tiempo de ejecución, pero… creemos que depende de si marcas el teléfono para debug o no.

Como conclusión final hemos conseguido reducir un proceso que le costaba una hora a unos 20 minutos.

2 Comentarios

  1. Y poner en el mismo bucle que recorres un:
    if (Actual % 100 = 0) {
    //Refrescar barra
    }
    o en lugar de 100 una variable que tenga en cuenta el número de registros.
    Lo digo porque las llamadas a funciones son bastante pesadas y para cada registro estas llamando a una función para hacer declaraciones de variables y varios cálculos.
    Quizá con un cálculo de módulo (es el % no?) .
    Saludos y genial el blog! Lo seguiré de cerca.

    • En primer lugar gracias por leer el blog y por animarte a comentar. Efectivamente tienes razón con tu sugerencia, aunque deberíamos multiplicar el numero de items por 100, puesto que nos interesa que se actualice cada cambio de porcentaje entero.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

*