Tips para programadores de apps

 

 

1) Revisar el consumo de memoria

Uno de nuestros objetivos al programar una aplicación para dispositivos móviles es no desperdiciar el uso de la memoria utilizándola eficientemente y evitando los memory leaks, en mi caso cuando estoy ejecutando el software que he programado, utilizo la siguiente rutina en Android que me va comprobando la memoria disponible actual y la memoria total del dispositivo.

Este procedimiento lo asocio a un componente tTimer para que cada segundo me informe de la situación actual del consumo de memoria.

Después voy abriendo y cerrando Forms varias veces y compruebo antes y después la memoria disponible. Cuando la diferencia es considerable toca revisar el código. Hay que tener en cuenta que el sistema Android es dinámico y en background se van abriendo y cerrando programas que forman parte del sistema operativo que también modifican la memoria disponible del dispositivo.

La rutina que utilizo es la siguiente:

 
USES
Androidapi.JNI.App;

VAR
    MemLibre, MemTotal: STRING;
    Am: JActivityManager;
    Mi: JActivityManager_MemoryInfo;

...

    Am := GetActivityManager;
    Mi := TJActivityManager_MemoryInfo.Create;
    Am.GetMemoryInfo(Mi);
    // bajamemoria := mi.lowMemory;
    MemLibre := (Mi.AvailMem DIV 1048576).Tostring() + 'Mb';
    MemTotal := (Mi.TotalMem DIV 1048576).Tostring() + 'Mb';
    Label2.Text := MemLibre + ' / ' + MemTotal;

2) Evitar el uso de "Release" con el componnte tWebBrowser

Si inserta un componente tWebBrowser (con su propiedad Name: WebBrowser1) no escriba WebBrowser1.Release para liberar memoria al cerrar la app. Esta instrucción está desactualizada y no tiene ningún efecto.

3) Controlar el uso de Form.BringTofront, después del Form.Show

No es necesario poner

Form1.Show;

Form1.BringtoFront;

Con poner Form1.Show es suficiente, ahorra código y evitará problemas cuando tiene muchos forms en la app.

4) Añadir FireDAC.Phys.SQLiteWrapper.Stat

Si usa FireDac, no olvide añadir en el USES de la unit: FireDAC.Phys.SQLiteWrapper.Stat 

Esto se ha activado en la última versión de Rad Studio la 10.4

5) No use Application.Processmessages al programar apps para Android.

 No tiene ningún efecto en el código


6) Optimizar SQLite

6.1) Use el comando Sweep de Firedac para optimizar la base de datos SQLite.

Internamente llama al comando VACCUM de SQLite, haciendo lo siguiente:

Primero copia los datos dentro de un archivo de base de datos a una base de datos temporal. Esta operación desfragmenta los objetos de la base de datos, ignora los espacios libres y vuelve a empaquetar páginas individuales. Luego, SQLite copia el contenido del archivo de base de datos temporal al archivo de base de datos original. Se sobrescribe el archivo de base de datos original.

Esto se hace de la siguiente forma:

Añada un componente llamado tFDSQLiteValidate al form.


 

 

y después escriba:

FDSQLiteValidate1.Sweep;

Recordar que la base de datos sobre la que tengamos que hacer esta operación ha de estar cerrada, en caso contrario salta una excepción.

6.2)  Use LIMIT 1 Cuando sólo quiera obtener una única fila al hacer una consulta.

En estos casos, añadir LIMIT 1 al query puede mejorar significativamente la velocidad. De esta forma la base de datos dejará de escanear resultados en el momento que encuentre uno, en lugar de recorrer toda la tabla o un índice.

6.3)  Indexe los campos de búsqueda.

Si utiliza siempre las mismas columnas para realizar búsquedas, indéxelos para mejorar la velocidad.

6.4) Evite SELECT *

Siempre que se pueda, coloque a continuación del SELECT los nombres de las columnas que use. Si una tabla tiene 2000 columnas no es eficiente hacer un select de las 2000.