{"id":23701206,"url":"https://github.com/gitfrandu4/android-viewmodel-retrofit","last_synced_at":"2026-01-29T11:30:15.591Z","repository":{"id":211625150,"uuid":"558912339","full_name":"gitfrandu4/android-viewmodel-retrofit","owner":"gitfrandu4","description":"Proyecto introducción al componente ViewModel de android","archived":false,"fork":false,"pushed_at":"2022-10-29T17:02:18.000Z","size":13748,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-12-30T09:32:50.044Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gitfrandu4.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-10-28T15:22:36.000Z","updated_at":"2022-10-28T15:54:47.000Z","dependencies_parsed_at":"2023-12-09T19:52:43.967Z","dependency_job_id":null,"html_url":"https://github.com/gitfrandu4/android-viewmodel-retrofit","commit_stats":null,"previous_names":["gitfrandu4/android-viewmodel-retrofit"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitfrandu4%2Fandroid-viewmodel-retrofit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitfrandu4%2Fandroid-viewmodel-retrofit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitfrandu4%2Fandroid-viewmodel-retrofit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitfrandu4%2Fandroid-viewmodel-retrofit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gitfrandu4","download_url":"https://codeload.github.com/gitfrandu4/android-viewmodel-retrofit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239776665,"owners_count":19695151,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-30T09:32:37.654Z","updated_at":"2026-01-29T11:30:15.538Z","avatar_url":"https://github.com/gitfrandu4.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ViewModel \u0026 Retrofit\n\nThis is a sample project to show how to use ViewModel and Retrofit together.\n\n* [Sincronía y Asíncronía](#sincronía-y-asincronía)\n* [Programación Reactiva](#programación-reactiva)\n* [ViewModel](#viewmodel)\n* [Arquitectura de una App](#viewmodel)\n* [LifeData vs StateFlow](#livedata-vs-stateflow)\n* [Retrofit](#retrofit)\n* [Práctica](#práctica)\n\n## Sincronía y Asincronía\n\n\u003cimg src=\"./img/async1.png\" width=\"400\"\u003e\n\n\u003cimg src=\"./img/async2.png\" width=\"400\"\u003e\n\n## Programación Reactiva\n\nEn la programación clásica, todo se basa en acciones que nosotros realizamos activamente. Lo que hacemos\nen cada caso es ir y preguntarle «oye, ¿qué datos tienes para mí ahora mismo?\n\nSi quiero algo:\n\n* Yo lo pido\n* Yo lo busco\n* Yo lo traigo y lo trato\n* Yo lo muestro\n\nEn la programación reactiva, le damos la vuelta a la idea. La forma de trabajar sería «estoy interesado en tus\ndatos, cada vez que haya un cambio infórmame».\n\nSi quiero algo:\n\n* Yo lo pido y espero a que me lo traigan\n* Alguien se encarga de ir buscarlo\n* Alguien se encarga de traelo y tratarlo\n* Alguien se encarga de entregarmelo\n\n## ViewModel\n\nEl componente ViewModel de Android cumple dos funciones: se encarga de la  preparación y administración de los datos relacionados con la vista y maneja la\ncomunicación de la vista con el resto de la aplicación.\n\nDesde el punto de vista de arquitectura la clase ViewModel está diseñada  como una plantilla para crear modelos de vista en el patrón MVVM.\n\n**¿Por qué usarlo?**\n\nPorque mejora el testing y la eficiencia de mantenimiento de tus casos de uso al aislar responsabilidades de tus controladores de UI (actividades y\nfragmentos).\n\n**¿Cómo funciona en cambios de configuración?**\n\nAsegura el guardado del estado en tu UI (Scope) cuando hay cambios de configuración como una rotación de pantalla. Ya que cuando una actividad es\nrecreada el framework reconecta automáticamente al ViewModel a la instancia.\n\n\u003cimg src=\"./img/viewmodel.png\" width=\"800\"\u003e\n\n**Descripción general de ViewModel**: https://developer.android.com/topic/libraries/architecture/viewmodel\n\n## Arquitectura de una App\n\n\u003cimg src=\"./img/mvp_vs_mvvm.png\" width=\"800\"\u003e\n\nLa arquitectura te orienta para asignar responsabilidades en tu app, entre las clases.\n\nUna arquitectura de app bien diseñada te ayuda a escalar tu app y a extenderla con funciones adicionales en\nel futuro.\n\nTambién facilita la colaboración.\n\nLos \u003cu\u003eprincipios de arquitectura\u003c/u\u003e más comunes son la separación de problemas y el control de la UI a partir de un modelo.\n\n| Responsabilidades del **fragment/activity**                                                                                       | Responsabilidades del **ViewModel**                                                                                                                                                                                                      |\n|-----------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Las actividades y los fragmentos son responsables de dibujar vistas y datos en la pantalla y responder a los eventos del usuario. | El ViewModel es responsable de retener y procesar todos los datos necesarios para la IU. Nunca debes acceder a tu jerarquía de vistas (como  un objeto de vinculación de vista) ni retener una referencia a la actividad o al fragmento. |\n\n\u003cimg src=\"./img/vm_scope.png\" width=\"400\"\u003e\n\n## LiveData vs StateFlow\n\nCuando trabajamos con un ViewModel, podemos usar dos tipos de objetos para \u003cu\u003etransmitir los datos a la vista\u003c/u\u003e.\n\n### LiveData\n\n* **LiveData** es un componente de Android que permite a los componentes de la IU observar los datos que cambian. LiveData es un componente de ciclo de vida, lo que significa que se actualiza solo cuando la app está en primer plano.\n* que está integrado en Android y eso ayuda a evitar Leaks de memoria\n* está programado con los ciclos de vida de las Activity/Fragment\n* y maneja las rotaciones de pantalla para no tener que recargar toda la app\n\n### StateFlow\n\n* **StateFlow** es un flujo de estado que emite valores de forma segura y permite a los suscriptores observar los cambios de estado. StateFlow es un componente de flujo, lo que significa que se actualiza en cualquier momento, incluso cuando la app está en segundo plano.\n* que está integrado en Kotlin y permite emitir multiples valores secuencialmente\n* es independiente del ciclo de vida de cada Activity/Fragment (en lo bueno y lo malo)\n\nDe un vistazo, en realidad son muy similares y puedes hacer prácticamente LO MISMO.\n\nSin embargo, bajo el capó, los Flow son una API más rica y flexible que amplía las capacidades de LiveData, sin algunos de los inconvenientes.\n\n## Retrofit\n\nPara hacer peticiones a una API, podemos usar la Librería de Retrofit que nos ayuda a trabajar con peticiones de manera sencilla y rápida.\n\nUna API es un conjunto de reglas que permite que diferentes programas se comuniquen entre sí. Utilizaremos JSON como \"lenguaje\" de comunicación entre servidores y la app.\n\nRetrofit es un cliente de servidores REST para Android y Java desarrollado por Square, muy simple y muy fácil  de aprender. \nPermite hacer peticiones al servidor tipo: GET, POST, PUT, PATCH, DELETE y HEAD, y gestionar diferentes tipos de parámetros, \nparseando automáticamente la respuesta a un tipo de datos.\n\n\u003cimg src=\"./img/retrofit.png\" width=\"400\"\u003e\n\n# Práctica\n\nVamos a utilizar la API de TheMovieDB para obtener géneros de películas en una app. \n\nResultado: \n\n| \u003cimg src=\"./img/Screenshot_1.png\" width=\"200\"\u003e | \u003cimg src=\"./img/Screenshot_2.png\" width=\"200\"\u003e | \u003cimg src=\"./img/Screenshot_3.png\" width=\"200\"\u003e |","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgitfrandu4%2Fandroid-viewmodel-retrofit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgitfrandu4%2Fandroid-viewmodel-retrofit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgitfrandu4%2Fandroid-viewmodel-retrofit/lists"}