Transcripciones
1. ¡Hola!: Bienvenido al curso de
inyección de dependencia en Android
usando Salud. Mi nombre es Garrett o hue. Estoy desarrollando
aplicaciones para Android desde 2013. En este curso, vas
a aprender qué es la dependencia, por qué puede ser un problema y cómo resolver ese problema
usando la inyección de dependencia. Aprenderás a implementar la inyección de
dependencia usando una
biblioteca llamada hilt. Además, vamos a crear una aplicación
simple de pronóstico del tiempo usando empuñadura. Para poder realizar este curso, debes estar familiarizado
con el desarrollo de Android. Vamos a utilizar el lenguaje de
programación Kotlin. También. Deberías tener Android Studio instalado
en tu máquina. Si estás listo,
comencemos el curso.
2. Por ejemplo: Comencemos el curso
con ejemplo rápido de dependencia e inyección de
dependencia. Aquí voy a mostrar
ejemplo de dependencia. Esta es la clase de motores. Tiene función de arranque que
trae motor está arrancando. Y tenemos la clase Car, que crea
instancia de motor. Y tiene función de arranque que imprime coche está arrancando
y arranca motor. También tenemos
función principal donde creamos instancia de coche y empezamos. El problema está aquí, esta línea, estamos creando instancias
de motor dentro del automóvil. En este caso, el motor
es dependencia. El automóvil
depende del vidrio del motor. ¿Cómo podemos resolver este problema? Se puede resolver. Moviendo, creando instancia
fuera de dependiente, movemos a función principal y pasamos una instancia al carro. Ahora estamos parsing motor
instancia en coche
usando su constructor. Esto se llama inyección
de dependencia. Ejecutemos este código
y veamos el resultado. El código está funcionando. Y este fue un
ejemplo rápido de lo que es la dependencia y
la inyección de dependencia.
3. Dependencia: En este video,
veremos qué es la dependencia. La dependencia ocurre
cuando un componente depende de otro componente. Por ejemplo, una clase
depende de otra clase. Este ejemplo, estamos creando instancias de motor dentro del coche. Entonces el auto depende del motor. En este caso, el automóvil es dependiente, el
antígeno es dependencia. Se puede decir lo que pueden ser
problemas con la Dependencia. El primer problema se
llama replicación. Estamos creando
motor de instancia dentro del coche. Entonces tal vez necesitemos crear tales
instancias en muchos lugares. Esto da como resultado la replicación de
código. Otro problema es la
mantenibilidad. Imagínese la situación cuando los motores constructor
funcionan con cadenas. Entonces necesitamos cambiar
el código en todas partes donde estemos creando
instancias de motor. Otro problema es la administración
del ciclo de vida. Aquí estamos creando instancias
de motor dentro del coche. Esto significa que cuando se retira el
automóvil, también se retira el
motor. Estos problemas se pueden resolver mediante el uso de inyección de
dependencia.
4. Inyección de dependencia: En este video, veremos
qué es la inyección de dependencia. La inyección de dependencia es crear e
inyectar dependencia. Este ejemplo, estamos creando
una instancia de motor en función
principal y pasando en dos coches función constructora. Y a esto se le llama inyección de
dependencia. La inyección de dependencia resuelve
problemas con la dependencia. Es replicación de código fuente mediante creación de dependencia
en un solo lugar. En este ejemplo, estamos
creando instancias de motor en función
principal y
pasando al objeto coche. Si necesitamos cambiar y
su función constructora, necesitamos cambiar el
código en un solo lugar. Así que esto mejora la
capacidad de mantenimiento del código. La inyección de dependencia resuelve el problema con la administración
del ciclo de vida. Aquí estamos creando
instancias de motor y objetos de autos que pasan. Entonces cuando se retira el auto
y no se retira, así tenemos control
sobre el ciclo de vida. Hay tres tipos de inyección de
dependencia, constructor, inyección de campo
y método. Como hemos visto en el ejemplo
anterior, se crea
la dependencia y pasa a la función
constructora. Esto se llama inyección de
constructor. Se prefiere este tipo
ya que podemos hacer que la dependencia sea privada para
hacerla inmutable. Otro tipo es la inyección
llena. En este caso, inyectamos
dependencia en campo. Este tipo de inyección se utiliza cuando constructor no
está disponible. Ejemplo es el sistema Android. No tenemos control
sobre los componentes de Android como actividad, fragmento y etc. Otro tipo es el
método de inyección. Este tipo de inyección se utiliza cuando no tenemos
control sobre constructor. Y queremos inyectar múltiples
dependencias a la vez.
5. Localizador de servicio: En este video, hablaremos
sobre el localizador de servicios. Hay dos formas de
resolver el problema de dependencia. primera forma es
la inyección de dependencia, donde las dependencias se
inyectan en dependientes. Con el fin de implementar
la inyección de dependencia, podemos usar la biblioteca curada. Otra forma de resolver problema de
dependencia es la búsqueda de dependencias, donde las dependencias se
recuperan desde fuera. llamado localizador de servicios, que devuelve dependencias
por su nombre. Déjame mostrarte un ejemplo
para el localizador de servicios. Aquí tenemos motor de cristal con función estrella que imprime el
motor está arrancando. Aquí tenemos objeto
llamado localizador de servicios, que crea instancia
de motor y función, que devuelve dependencias
por su nombre. Por ejemplo, devuelve instancia de motor cuando el nombre
es igual a dos motores. Si no se encuentra nombre, arroja una excepción de
argumento ilegal con dependencia de mensaje con la siguiente clave que
no se ha encontrado en la clase de automóvil. instancia del motor
se recupera del localizador de servicios usando la
función de búsqueda con la clave del motor. Entonces arranca la función de impresión del coche está arrancando y
arranca el motor. En función principal,
creamos instancia de motor y lo llamamos función de
inicio. El localizador de servicios es un patrón
diseñado que da acceso
al objeto por su nombre. Permite crear objetos en un solo lugar y
obtenerlos por sus nombres. Se resuelve el problema de dependencia mediante la creación de instancia
en un solo lugar. Por lo que no hay aplicación de código. También crea
dependencia en el exterior. Por lo tanto, el cambio en la dependencia no da como resultado un
cambio en dependiente. Además, el ciclo
de vida de la dependencia
no está ligado al ciclo
de vida de los dependientes. El localizador de servicios es utilizado
por una biblioteca llamada coin, que está fuera del alcance
de este curso.
6. Daga y Hilt: Daga y una daga es biblioteca de inyección de
dependencia, lo que facilita
la implementación de la inyección de dependencia. Reduce mucho código
repetitivo al
implementar la inyección de dependencia. Q también es biblioteca de
inyección de dependencia, que se construye sobre la daga y facilita el
uso de daga. Cómo funciona. Dagger usa
procesador de anotaciones para analizar el código, para identificar dónde inyectar dependencias y qué tipo de
dependencias se requieren. Entonces daga generar código fuente cual es compilado por compilador. Aquí está la biblioteca de
inyección de dependencia, que se construye sobre la daga. Permite escribir
menos código al tener contenedores
predefinidos
para las clases de Android también facilita la inyección de
dependencias en el modelo de vista y la
inyección del modelo de vista en sí mismo.
7. Código: El código para este curso está
disponible en la siguiente URL. Si abres esa URL, puedes encontrar el
repositorio de código en GitHub, que contiene código para una aplicación simple de
pronóstico del tiempo. Para clonar
este repositorio, haz clic en Código, haz clic aquí para copiar la URL y
abrir Android Studio. En Android Studio, haz clic en Archivo. Nuevo Proyecto a partir del control de
versiones. Aquí, pega la URL
que copiamos. Y aquí debes establecer el directorio donde quieres guardar el proyecto
y hacer clic en Clonar. Después de clonar el código, puedes ejecutar esta aplicación
en tu dispositivo o emulador.
8. Sin inyección de dependencia: En este video, voy a mostrar código sin inyección de
dependencia. Vamos a abrir Android Studio. Ya hemos clonado
código del repositorio. Y ahora estamos en rama maestra. Tenemos que verificar
no hay sucursal DI. Esta rama contiene código
sin inyección de dependencia. En primer lugar, abramos
AndroidManifest.xml. Aquí podemos ver que tiene un permiso para la conexión
a internet, utiliza el tráfico de texto claro
se envía a través para
poder usar la conexión HTTP. Y tenemos una pantalla
llamada Actividad de pronóstico. En la actividad de previsión,
estamos creando instancias de retrofit
usando URL base. Y estamos configurando nuestra fábrica de convertidores
JSON para convertir datos
JSON
en objeto. Al final, estamos creando
instancia de interfaz API. En el método onCreate, estamos configurando un XML de diseño
como vista de contenido. Vamos a abrirlo. Aquí tenemos una
vista de reciclador para mostrar los datos de pronóstico. Entonces estamos llamando al método de pronóstico del
jet para
obtener el pronóstico del tiempo. En el método jet forecast, estamos creando co-rutina
para obtener el pronóstico del tiempo. Y luego estamos cambiando dos despachador principal para
mostrar pronóstico del tiempo. En el método de pronóstico corto, estamos configurando el
nombre de la ubicación es el título, y luego verificando si los datos diarios
del pronóstico están disponibles. Si no es nulo, estamos configurando el
administrador de diseño para la vista del reciclador. Y entonces estamos configurando
pronósticos adaptador. El adaptador recibe los datos de
previsión
y los establece en el diseño, que es la previsión del elemento de lista. Contiene tres,
tarda dos años en
mostrar la fecha, la temperatura
y el estado. En build gradle se han agregado
dependencias de archivos para retrofit y retrofit y
deshonrar
bibliotecas convertidora. Vamos a abrir la interfaz API. E incluye una función que devuelve
pronósticos, respuesta, campañas de respuesta de
pronóstico, información de ubicación
diaria actual para los datos de pronóstico. Ahora, vamos a ejecutar esta aplicación
y ver el resultado. Aquí puede ver la
aplicación que muestra el nombre de la
ubicación en el título y los datos de
pronóstico del tiempo como una lista.
9. Con inyección de dependencia: En este video, veremos código con inyección de dependencia. En video anterior,
hemos visto código sin inyección de
dependencia
donde creamos una instancia de API en la actividad de
pronóstico. Entonces API es dependencia y la actividad
pronosticada es dependiente. Ahora cambiemos a
rama llamada DI, que contiene código con inyección de
dependencia. Para poder utilizar aquí biblioteca, se debe agregar
al proyecto. Déjenme mostrar cómo se
ha agregado. En primer lugar, vamos a
abrir build gradle file. Aquí podemos ver que se ha agregado la biblioteca plug-in para VIH. Vamos a abrir Build Gradle
file for app module. Y se aplicó plug-in para su
biblioteca. Además, necesitamos agregar el procesador
de anotaciones
Kotlin para poder usar la biblioteca heal. Se aseguró de que el proyecto usa Java 1.8 ya que lo requiere curado. Después agregamos dependencia
para biblioteca sanada. Y agregamos esto para permitir que
las referencias generen código. siguiente paso es crear una
clase llamada App, que extiende la aplicación y aplicación Android curada
anotada. Esta anotación le dice a heel que genere código de
inyección de dependencia. Abra AndroidManifest.xml
y declare la aplicación usando el atributo
name. Dentro del paquete IP, creamos una clase de módulo
que se anota
con anotaciones instaladas en y
módulo. Dentro de este módulo creamos la función que se
anota con proporciona un paciente y
proporciona una instancia API que se inyectará
en la actividad de pronóstico. La actividad de pronóstico se anota con punto de entrada de
Android para
inyectar dependencias en ella. Aquí estamos inyectando
instancia de un chico con anotación Inyectar. Entonces no lo estamos creando
dentro de la actividad de pronóstico. Ahora, vamos a ejecutar este código
y ver el resultado. Aquí podemos ver la
misma aplicación, pero esta vez implementamos la inyección de
dependencia.
10. Flujo de trabajo: En este video, voy a
mostrar cómo funciona la salud. Empecemos con la clase AP, que extiende la aplicación y utiliza la anotación de
aplicaciones de Android curada. Anotación dice
aquí para generar código de inyección de
dependencia
incluyendo componente singleton. El componente Singleton es un contenedor de
dependencia a nivel de
aplicación, que inyecta dependencias. En la clase App Model, estamos usando la
anotación de módulo para decirle que el módulo de aplicación
proporciona dependencias instaladas en la anotación
se utiliza para indicar a qué módulo de aplicación componente
proporciona dependencias. En este caso, un módulo proporciona dependencias para el componente
singleton, que es el contenedor de
dependencia a nivel de aplicación. El módulo de la aplicación proporciona
dependencia como instancia de API usando
proporciona anotación. En la actividad de previsión, la anotación del punto de
entrada de Android se utiliza para crear el componente de
actividad, que es hijo del componente
singleton. Entonces esto significa que el componente de
actividad para pronósticos de actividad tiene acceso a dependencias al componente
singleton. Mediante el uso de Injection anotación, podemos inyectar instancia de API. El flujo de trabajo general
parece que este módulo de aplicación proporciona instancia de API
a componente singleton. El componente de actividad de la
actividad de previsión tiene acceso a dependencias de componentes
singleton e inyecta instancias de
dependencias de API
usando la anotación Injection.
11. ViewModel: En este video,
voy a mostrar cómo inyectar dependencias en el modelo de vista. En primer lugar,
abramos módulos,
construyamos un archivo gradle
y agreguemos dependencia para extensiones de Kotlin
para artefactos de actividad. Dentro del modelo de vista de pronóstico, creamos LiveData mutables
para la respuesta del pronóstico. Y creamos LiveData, que será observado
por la actividad pronosticada. Cuando se inicializa el
modelo de previsión. Sin embargo, se llama método de pronóstico. El método de pronóstico crea
corutina, que se borra. Cuando se borra este modelo de vista. Insights es un alcance corrutinario. Obtenemos los datos del pronóstico y
actualizamos LiveData mutable. En la actividad de previsión, inyectamos modelo de vista de
previsión no
usando la anotación Inyectar, sino usando la API del
proveedor ViewModel. De lo contrario, tendríamos múltiples instancias
de modelo de vista. Aquí establecemos observador para los datos de
pronóstico del tiempo, que llama mostrar
método de pronóstico en Actualización. Ahora, ejecutemos esta aplicación
y veamos el resultado. Como puedes ver está funcionando. Pero esta vez
estamos obteniendo datos en modelo de vista en
lugar de actividad.
12. Encuadra: En este video, voy a mostrar
cómo usar la anotación de los lazos. Ahora creamos repositorio de datos, que sirve como una
única fuente de datos. Para ello,
creamos una interfaz llamada repositorio con una
función, get forecast. Es la función de suspensión que
devuelve la respuesta del pronóstico. Creamos una clase llamada impulso
repositorio, que es la implementación
de la interfaz de repositorio. Y recibe instancia de API para implementar el método get
forecast. En la clase de módulo de aplicación, creamos una función
que proporciona instancia de
implementación repositorio
cuando se solicita repositorio. Aquí no estamos obteniendo
instancia de API y busing a la implementación del
repositorio. En videos anteriores, utilizamos proporciona anotación para
proporcionar dependencia. Pero en este video, me gustaría mostrar otra
forma de brindar dependencia. Para ello, creamos
otro módulo que proporciona dependencias
para el componente singleton. Y en este caso, utilizamos ataduras de saneamiento
para brindar dependencia. Aquí creamos una nueva
función que proporciona instancia de
implementación repositorio
cuando se solicita repositorio. Cuando usamos ataduras de saneamiento, la implementación de la función
es proporcionada por empuñadura. En la implementación del repositorio,
habilitamos este fragmento de código para poder inyectar API cuando
usamos el saneamiento de los vinculantes, la implementación de la función
es proporcionada por la salud. Es por eso que necesitamos
usar Injectar anotación en función
constructora para
inyectar instancia de API. En previsión modelas, inyectamos repositorio
en lugar de API, sirve a una única
fuente de datos. Ahora, vamos a ejecutar esta aplicación
y ver el resultado. Como podemos ver, está
funcionando de la misma manera. Pero esta vez usamos repositorio como una única
fuente de datos. Y también utilizamos el
saneamiento buy-in para vincular la dependencia.
13. Singleton: En este video, voy a
mostrar cómo proporcionar la misma instancia cuando se solicita
dependencia. El módulo proporciona dependencias
para el componente singleton y crea instancias cada vez que
se solicita dependencia. Para verificar esto, podemos inyectar instancia de
API e iniciar sesión como una cadena. Hacemos lo mismo en
repositorio en clase masiva. Ahora vamos a ejecutar este código
y ver el resultado. Te sientes abierto logcat, podemos ver que las instancias
de API no son las mismas. Con el fin de
maquillar módulo para devolver la misma instancia cada vez que podamos usar anotación singleton. Esta anotación le dice a
healed que cree solo una instancia en el contenedor de
dependencia de componentes
singleton. Ahora vamos a ejecutar este código
y ver el resultado. Esta vez podemos ver
que las instancias son las mismas.
14. CONTEXTO: En este video, voy a mostrar
cómo inyectar contexto. En primer lugar, necesitamos
agregar dependencia para interceptor http, verificador
de color. En el módulo app,
creamos instancia de interceptor de chakras,
que requiere contexto. Podemos obtener contexto usando la anotación de contextos de
aplicación. Luego inyectamos
interceptor de chocolate en función donde creamos una instancia
de un cliente HTTP OK. Luego proporcionamos un cliente HTTP en una función donde
creamos instancia de retrofit. Ahora, vamos a ejecutar este código
y ver el resultado. Después de correr, abra
el cajón de navegación y haga clic en la notificación, que dice que la grabación
es actividad GTP. Y aquí podemos ver la lista de peticiones que se ha
enviado al backend.
15. Llamado: En este video, voy a
mostrar cómo proporcionar instancias del mismo tipo
con nombre anotación. En primer lugar, abrir módulos
construidos archivo Gradle y agregar dependencia para interceptor de
registro HTTP. Esta biblioteca registra
las solicitudes HTTP en logcat. Luego abra la
clase de módulo y agregue la función, que proporciona otro interceptor de inicio de
sesión. Y ahora estamos brindando dos
instancias al mismo tiempo. Interceptor. Cuando inyectamos dependencia, heel debe saber qué instancia
nos gustaría inyectar. Para ello se utiliza
anotación con nombre. Aquí estamos configurando nombrelo anotación con clave de
interceptor de inicio de sesión. Para el interceptor Tucker,
estamos usando nombre y anotación con clave interceptor
http. Cuando estamos obteniendo
esas instancias, debemos usar la misma
anotación con la misma clave. Y aquí estamos configurando interceptores
HTTP
para el cliente HTTP. Ahora vamos a ejecutar esta aplicación
y ver el resultado. Ahora, podemos ver log para solicitudes
HTTP en logcat.
16. Calificador: En este video, voy a mostrar
otra forma de cómo proporcionar instancias del mismo tipo
usando anotaciones personalizadas. En el archivo del módulo de la aplicación, creamos dos anotaciones personalizadas usando anotación de calificador. Usando
anotación de retención, hacemos que esta anotación se almacene
en salida binaria. Y creamos anotaciones, http e interceptor de inicio de
sesión. Aquí proporcionamos
instancias de interceptor usando anotaciones personalizadas
en lugar de anotación de ID de nombre. También reemplazamos la anotación name
it con anotación
personalizada cuando
obtenemos esas instancias. Ahora, vamos a ejecutar esta aplicación
y ver el resultado. Y podemos ver mismo resultado, log de peticiones HTTP en logcat.
17. Componente: En este video,
hablaremos de componentes. Una de las ventajas
de la biblioteca curada, contiene
componentes predefinidos. Los componentes son contenedores de
dependencias que
inyectan dependencias. Cada componente está ligado a algún ciclo de vida en la aplicación
Android. Aquí podemos ver jerarquía de componentes y componente principal
es componente singleton. Está disponible en
toda la aplicación. Se crea cuando se crea
la aplicación, se destruye cuando se destruye
la aplicación. Lo mismo se aplica a otros
componentes, por ejemplo
, componente de
actividad
se crea cuando se crea
y destruye la actividad. Cuando se destruye la actividad. Esto es útil cuando necesitamos dependencia solo en una actividad, no en toda la aplicación. De acuerdo con esta jerarquía, las dependencias del componente
singleton están disponibles para el componente de
actividad, pero las dependencias del componente de
actividad no
están disponibles para el componente
singleton u otros componentes como componente
ViewModel
porque es un componente hermano. Anotación anterior, cada
componente se usa para proporcionar una sola instancia
de dependencia, por ejemplo, anotación
singleton para el componente
singleton o anotación de esculpir
actividad se usa para el componente de actividad. Vamos a crear un nuevo
módulo que proporcione dependencias para el componente de
actividad. En primer lugar, abrir en módulos, construir el archivo Gradle y agregar
dependencia para la biblioteca Picasso. Se utiliza para cargar la imagen. Después en el XML de pronóstico de elemento de lista, agregamos nuevo ImageView para mostrar el
icono para la condición meteorológica. Luego creamos una nueva interfaz
llamada image loader, que tiene una función para cargar la imagen de URL en imágenes. Después de eso, creamos
la implementación del cargador de
imágenes llamado
Picasso image loader, e implementa la función
load image mediante el uso de la biblioteca Picasso. Después de eso, creamos un nuevo modelo llamado módulo de actividad,
que proporcionan dependencias. Para componente de actividad. Tiene una función y proporciona
porque
así cargador de imágenes, cuando se solicita cargador de imágenes. Aquí estamos usando
la
anotación de esculpir actividad para usar una
instancia de cargador de imágenes. En la actividad de pronóstico,
estamos inyectando cargador de
imágenes y pasando
al adaptador de pronósticos. En el adaptador de pronóstico,
obtenemos ese cargador de imágenes y lo
usamos para cargar la imagen
de URL en ImageView. Ejecutemos este código
y veamos el resultado. Como podemos ver ahora, está mostrando íconos para
pronósticos meteorológicos, condiciones.
18. Gracias: Este es el final de este
curso donde aprendes qué dependencia e inyección de
dependencia. Aprenderás a
configurar sanados para implementar inyección de
dependencia usando
diferentes futuros de aclamados. Como bono, me
gustaría brindar preguntas de
entrevista sobre inyección de
dependencia y sanado. Es archivo PDF con preguntas
y respuestas y lo
puedes descargar de la
sección de recursos de este video. Quiero darle las gracias
por ver este curso. Espero que te haya gustado y nos veamos
en mis próximos cursos.