jueves, julio 28, 2016

Cómo aprender más Android, usa Android Lint.

Siempre me han gustado las cosas buenas (los últimos gadgets tecnológicos del mercado, buena ropa, buenos autos, etc) en el código soy igual. Una de las herramientas que me ha ayudado muchísimo en cuanto al aprendizaje de Android es Android Lint, acá el link para más detalles.

En resumen, Android List es una herramienta que te ayuda a verificar tu código, estructura, buenas practicas entre muchas otras sin necesidad siquiera de correr tu aplicación.

Ayer, mientras analizaba el código viejo de una de mis apps, la cual estoy actualizando a una nueva versión, aprendí por ejemplo, sobre las clases estáticas y el Context de Android.

Un fragmento de ejemplo de un singleton.

public class MyClass {

    private static Context context;
    private static MyClass myClassInstance;

    /**
     * Return an instance of this class
     */

    public static MyClass getInstance(Context c) {

        context = c;

        if (myClassInstance == null) {
            myClassInstance = new MyClass();
        }

        return myClassInstance;
    }
}


El método getInstance retorna la instancia de esa clase, pero si vemos en el constructor, estamos pasando Context como parámetro y la asignamos a la variable global context para tenerla accesible siempre.

Esto parece que no causa daño alguno pero al analizar este código con Android Lint, vemos lo siguiente.

"Do not place Android context class in static fields, this is a memory leak (and also breaks Insta Run)" en plano Castellano dice: No coloque la clase de contexto de Android en campos estáticos, esto es una pérdida de memoria (y también puede romper Insta Run).

¿Cómo obtuve esto?

Ok, acá les enseño cómo correr Android Lint y obtener este error.

Android Studio


Con Android Studio seleccionado (compartimiento en Mac) vamos al menú que dice Analyze -> Inspect Code.


Venta de ámbito de la inspección

Nos aparece la ventana preguntando el ámbito de la inspección, las opciones son:

Whole project: Va a verificar TODO cuando digo todo , es todo el projecto, librerías, etc, dependiendo de sus máquinas y el tamaño del proyecto puede tardar un rato en finalizar.

Module 'app' en mi caso aparece 'app'  porque tengo seleccionado el módulo en el explorador de proyecto.

Current file, sólo el archivo que tengo abierto en el editor, o que tiene el cursor activo (esto si tenemos varios abiertos a la vez en vistas divididas)

Custom scope, un ámbito personalizado - nunca me meto ahí, pero es para personalizar lo que quieres analizar.

Inspection profile. Dejen lo en default

Para este ejemplo en particular del singleton y el Context seleccioné "Current File".



Al finalizar, nos va a mostrar la sección de "Inspection" usualmente aparece abajo. Si no está abierta (que la abre automáticamente - pues, dale clic).

A la izquierda, tenemos  los resultados de la inspección
A la derecha, la explicación de lo que significa la inspección seleccionada y en la mayoría de los casos cómo solucionarlo.

Para el caso de Context no dice qué hacer, pero podemos Googlear un poco y leer cómo solucionarlo.

La solución es tan simple como eliminar el parámetro Context del método getInstance, volarnos la variable global, porque no es necesaria tenerla global, y agregar el parámetro a el(los) método(s) dónde vayamos a usar el context. Un ejemplo sería.


MyClass.getInstance().myMethod(context)


Listo!!! un posible error menos en nuestro proyecto.

Espero sus comentarios.

Saludos.