Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android

Inyección de dependencias en Android con RoboGuice

by
Difficulty:IntermediateLength:MediumLanguages:

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Introducción

RoboGuice es también llamado Google Guice en Android, en un framework de inyección de dependencia fácil de usar, que hace el desarrollo de Android sea más intuitivo y conveniente. Usando este framework, usted puede reducir drásticamente la cantidad de código a escribir y hacer que las tareas tengan mejor rendimiento, como inicializar varios recursos, acceder a los servicios de Android y administrar los eventos.

En este tutorial,veremos como añadir más de RoboGuice en sus proyectos.

1. Entendiendo inyección de dependencia.

Tradicionalmente, si un objeto depende de otro, este mismo tiene la responsabilidad de satisfacer esa dependencia. En términos simples, si la instancia de la clase A depende de la instancia de la clase B, entonces usualmente el desarrollador espera llamar al constructor de la clase B dentro del código de la clase A.  Esto, obviamente, lleva a acoplamiento estrecho entre las dos clases.

Inyección de Dependencia es un patron de diseño en que los objetos se basan en código externo, que se conoce comunmente como inyector de dependencia, para satisfacer esas mismas dependencias. Esto significa que si un objeto depende de otros objetos, no tiene por qué saber cómo se crean o se inicializan los objetos. Esto reduce el acoplamiento entre los objetos y conduce a código que es más modular, más fácil de modificar, y menos complejo para probar.

Por lo tanto, mediante la inyección de dependencia, en gran medida puede acabar con constructores y métodos de fábrica en la lógica de su proyecto de negocio.

Como trabaja RoboGuice

Google Guice es un framework que hace que sea facil crear, configurar y usar un inyector de dependencias en sus proyectos java. RoboGuice construye sobre Google Guice y este viene pre-configurado con un inyector de dependencia para Android. En pocas palabras, desempaquete, RoboGuice sabe como inicializar varios objetos de Android, tomando referencias a varios recursos de su aplicacion y mas.

RoboGuice usa anotaciones Java, que no son mas que metadatos embebidos dentro del codigo Java, para determinar donde tiene que ser inyectado. Las versiones anteriores de RoboGuice usaban para procesar anotaciones usando el API de Reflexión de Java durante el tiempo de ejecución y eran a menudo criticadas por ser lentas. RoboGuice 3, sin embargo, viene con RoboBlender, un procesador de anotación de compilación que mejora drásticamente el rendimiento de RoboGuice.

Configurando RoboGuice

Antes que uses RoboGuice, debes agregar como una dependencia de alcance "compile" en al archivo build.gradle de su modulo. Este esta disponible en repositorio por defecto de Android Studio, jcenter, solo requiere de una linea de codigo.

Para mejorar el rendimiento de RoboGuice, es recomendable tambien añadir RoboBlender, como una dependencia de alcance "provided"

Para permitir usar las anotaciones de RoboGuice en tus actividades Android, ellas deben extender de RoboActivity en lugar de Activity. De manera similiar, si deseas usar las anotaciones dentro de un servicio de Android, este debe extender de RoboService en lugar de Service.

4. Asociando Layouts con Actividades

Normalmente, usuarias el metodo setContentView pasandole un recurso layout con el fin de que la Activity tenga un diseño. RoboGuice ofrece un medio alternativo para hacer lo mismo, la anotacion @ContentView

Por ejemplo, vemos como aplicar el layout definido en el archivo XML llamado activity_main.xml a un RoboActivity llamado MainActivity:

5.- Inyectando Vistas

Si usted piensa utilizar el método findViewById y usar una coversion a View del objeto retorno involucra mucho trabajo, usted puede usar la anotacion @InjectView de RoboGuice en su lugar.

Por ejemplo, considere el siguiente layout:

Para inicializar los dos widgets definidos en el XML en RoboActivity, usted podria escribir lo siguiente:

6. Inyectando Recursos

Acceder los recursos en su aplicacion usando la API de Android involucra gran cantidad de diferentes clases y funciones. Para rescatar un Drawable, por ejemplo, usted necesita usar CotextCompat.getDrawable Para rescatar un Animation, usted necesita usar AnimationUtils.loadAnimation

La anotacion @InjectResource  de RoboGuice ofrece una mejor forma consistente para rescatar todos los tipos de recursos. El siguiente trozo de codigo se muestra como inyectar un ColorStateList, un Drawable, un String y un recurso de Animation.

7. Inyectar Servicios de Sistema

Para obtener una referencia a un servicio de sistema de Android, como el PowerManager o el Vibrator, usted puede usar la anotacion @Inject en lugar de usar el metodo getSystemService. Por ejemplo, aquí vemos que se obtiene una referencia a PoweManager.

8. Inyectando Extras.

usted puede usar la anotacion @InjectExtra para inyectar los extras que son pasados a RoboActivity. El siguiente trozo de código inyecta un extra con la clave EMAIL_ADDRESS:

Note que @InjectExtra puede causar un error de ejecución si el extra no esta presente. Si el extra es opcional, usted debe incluir una bandera con la palabra optional que puede ser seteado a true con el fin de evitar el error.

9. Inyectando nuestra Clases

Hasta ahora hemos estado inyectando elementos específicos del SDK de Android. Para inyectar sus propias clases, debe usar la anotación @Inject. @Inject se comporta de forma similar a la palabra clave de Java new y no es necesario realizar cambios en una clase para que sea inyectable, siempre y cuando tenga un constructor predeterminado. Por ejemplo, considere la siguiente clase:

Para inyectar una instancia de la clase Employee, debería utilizar el código siguiente:

10. Uso de proveedores personalizados

Si desea un control más fino de lo que se inyecta cuando se utiliza @Inject, debe crear sus propios proveedores personalizados.

Vamos a crear un proveedor sencillo que devuelva un número aleatorio cada vez que @Inject se utiliza para inicializar un Integer.

Paso 1: Crear un proveedor

Un proveedor es sólo una clase que implementa la interfaz  Provider. Por lo tanto, cree una nueva clase llamada MyRandomNumberProvider que implementa Provider y reemplaza su método get.

Como habrás adivinado, el valor de retorno del método get es lo que se inyecta cuando se usa @Inject. Para devolver un entero aleatorio, agregue el siguiente código al método get:

Paso 2: Crear un módulo

Para poder utilizar su proveedor personalizado, debe crear un módulo para él. Un módulo es una clase que se extiende de la clase AbstractModule. Dentro del módulo, se anula el método configure y se especifica a qué clase debe vincular el proveedor utilizando los métodos bind y toProvider.

Para crear un módulo para MyRandomNumberProvider, cree una nueva clase Java llamada MyRandomNumberModule y añada el código siguiente:

Paso 3: Registrar el módulo

Para que RoboGuice sepa sobre tu módulo, debes registrarlo en AndroidManifest.xml de tu aplicación usando una etiqueta meta-data. El atributo name de la etiqueta debe establecerse en roboguice.modules y su atributo value debe contener el nombre de clase del módulo.

El proveedor ya está listo. En este punto, si anota un Integer con @Inject, se inicializará con un número aleatorio.

11. Trabajar con Singletons

Si es un desarrollador que prefiere utilizar un singleton para compartir datos entre varias actividades y servicios, puede utilizar las anotaciones @Singleton y @Inject para simplificar su código.

Al agregar la anotación @Singleton a una clase, puedes dejar que RoboGuice sepa que no debe crear más de una instancia de la clase. El siguiente código crea un singleton llamado MySingleton:

Ahora puede usar la anotación @Inject para inyectar el singleton en sus clases. Por ejemplo, aquí es cómo se inyecta MySingleton:

12. Observación de eventos

Mediante el uso de la anotación @Observes, puede observar varios eventos asociados con una Activity. Esto significa que no tiene que anular los métodos onCreate, onResume y otros métodos de ciclo de vida de la clase Activity.

El código siguiente muestra cómo se puede utilizar la anotación @Observes como alternativa a la sustitución de los métodos onCreate y onDestroy:

Conclusión

En este tutorial, aprendió a usar RoboGuice para que su código sea más conciso y legible. Al hacerlo, también aprendió a usar las anotaciones de Java y el patrón de inyección de dependencia.

Para obtener más información sobre RoboGuice, recomiendo navegar por su wiki en GitHub.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.