Skip to content

Proyecto de Android con Kotlin usando el patrón MVVM donde implemento algunas librerías de Android Jetpack como Navigation y Databinding; para la creación de una aplicación sencilla donde consumo datos de la The Rick and Morty API con Retrofit, Glide, GSON, Coroutines.

Notifications You must be signed in to change notification settings

Kulnois/Rick-And-Morty-App-Kotlin

Repository files navigation

[Rick and Morty APP]

Dev Trivia Gif

Proyecto de Android con Kotlin usando el patrón MVVM donde implemento algunas librerías de Android Jetpack como Navigation y Databinding; para la creación de una aplicación sencilla donde consumo datos de la The Rick and Morty API con Retrofit, Glide, GSON, Coroutines.

Dependencias

Arquitectura

Este proyecto esta basado en la arquitectura MVVM (Model View ViewModel). También tenemos que los componentes de arquitectura como el Data Binding están modelados con dicho patrón. MVVM

Guía de arquitectura android google GOOGLE

Rick And Morty App Kulnois

Uso de Retrofit y Gson

Para utilizar la librería en el proyecto tienen que agregar en el archivo build.gradle de tu modulo lo siguiente en dependencies:

dependencies {
  ...
    // retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
  
    // gson
    implementation 'com.google.code.gson:gson:2.8.6'
  ...
}

Ahora procedemos a crear nuestro directorio network donde vamos a crear nuestro archivo Api Service que para este caso se llamara RickAndMortyApiService una vez creado el archivo creamos una constante la cual tendrá la ruta de la API

    private const val BASE_URL = "https://rickandmortyapi.com/api/"

Ahora procedemos a crear una instancia de Retrofit el cual le pasamos GsonConverterFactory.create() la cual se encargara automáticamente de mapear los datos JSON a los objetos kt o Java y luego le pasamos la ruta anteriormente creada

    private val retrofit = Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(BASE_URL)
        .build()

Creamos nuestra Interface la cual tendrá nuestra petición GET a la API la cual esta formada por: @GET("character/") para obtener los personajes la API dispone de solicitudes GET mediante character/. @Query("page") type: Int para pasar parametros por ruta, que en este caso es el numero de la pagina que queremos consultar character/?page=2 Response<DataRickAndMorty> y le indicamos que nos devuelva un respuesta de tipo DataRickAndMorty para maquetar los datos JSON

    interface RickAndMortyApiService {    
        @GET("character/")
        suspend fun getData(@Query("page") type: Int):
                Response<DataRickAndMorty>
    }

Y ya de ultimo creamos nuestro objeto para acceder a nuestro servicio con retrofit y consultar los datos

    object RickAndMortyApi {
        val retrofitService : RickAndMortyApiService by lazy {
            retrofit.create(RickAndMortyApiService::class.java)
        }
    }

Para la consulta de datos va a depender mucho de nuestra API como este estructurada puede manejar diferente tipo de peticiones como son GET, POST, PUT, DELETE, PATCH siempre revisar la documentación de la API para la implementación Rick and Morty API Docs

Ahora procedemos a consumir los datos desde nuestro ViewModel lo recomendó es manejar el patrón Repository Pattern donde creamos un archivo repository donde tendremos esta lógica separa del ViewModel pero este ejemplo lo manejaremos desde ViewModel.

Creamos nuestro método getData(page: Int) en el ViewModel donde consultamos los datos y capturamos los errores de la petición

    private suspend fun getData(page: Int) {
            try {
                val response = RickAndMortyApi.retrofitService.getData(page)
                if (response.isSuccessful) {
                    _rickAndMortyData.value = response.body()?.results
                } else {
                    _status.value = RickAndMortyStatus.ERROR
                    _rickAndMortyData.value = ArrayList()
                }    
            } catch (e: UnknownHostException) {
                //No hay conexión a Internet o el host no está disponible
                _status.value = RickAndMortyStatus.ERROR
                _rickAndMortyData.value = ArrayList()
            } catch (e: SocketTimeoutException) {
                //Se agota el tiempo de espera
                _status.value = RickAndMortyStatus.ERROR
                _rickAndMortyData.value = ArrayList()
            } catch (e: Exception) {
                _status.value = RickAndMortyStatus.ERROR
                _rickAndMortyData.value = ArrayList()
            }
    }

Para ejecutar la consulta automáticamente cuando se carga la vista la iniciamos en nuestro constructor secundario o bloque init de la siguiente manera

    private var viewModelJob = Job()
    private val coroutineScope = CoroutineScope(viewModelJob + Dispatchers.Main)

    init {
        coroutineScope.launch {
            getData(1)
        }
    }

Coroutines son una nueva característica del lenguaje Kotlin que nos permite escribir código asincrónico de una manera más idiomática. Se predirá decir que las Coroutines son una alternativa ligera a los hilos "Las corrutinas proporcionan una forma de evitar bloquear un hilo y reemplazarlo con una operación más económica y controlable" Coroutine CoroutineScope

App Release Rick And Morty APK

About

Proyecto de Android con Kotlin usando el patrón MVVM donde implemento algunas librerías de Android Jetpack como Navigation y Databinding; para la creación de una aplicación sencilla donde consumo datos de la The Rick and Morty API con Retrofit, Glide, GSON, Coroutines.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages