Loader para Retrofit
Tags: android, retrofit, tutorial, spanish
Published: 2022-12-07 15:36:41

Antes de leer este artículo, te recomiendo que pases por acá, donde te enseño a [Como Implementar Retrofit](https://dev.to/maxwellnewage/como-implementar-retrofit-en-nuestra-app-4m9p).

Siguiendo el ejemplo de la API de Pokemon, vamos a crear un loader para reducir nuestras lineas de código por cada llamada a Retrofit.

## Optimicemos esto…
Primero que nada, repasemos nuestros componentes actuales:

- PokemonAPI: Interfaz que determina los endpoints del servicio.
- PokemonByIdResponse: Nuestro modelo de respuesta al servicio de obtener un pokemon por id.
- MainActivity: Nuestra activity donde llamamos al método call para iniciar el flujo de respuestas de nuestro servicio.

Teniendo esto en cuenta, lo que debemos hacer es muy sencillo. Partimos de la base que necesitamos una clase loader y tomamos la instancia de Retrofit que teníamos en MainActivity, pasándola a nuestra nueva clase como constructor:

```java
public class PokemonLoader {
    PokemonAPI pokemonAPI;
    final String URL_BASE = "https://pokeapi.co/api/v2/";
     
    public PokemonLoader() {
        Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(URL_BASE)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
        pokemonAPI = retrofit.create(PokemonAPI.class);
    }
}
```

La única diferencia con nuestra actividad es que tenemos una constante y la interfaz global. Quizá URL_BASE no hace falta que sea global, pero por una cuestión de ordenamiento, deberíamos hacerlo.

Luego debemos implementar nuestra interfaz, para obtener los métodos de la API:

```java
public class PokemonLoader implements PokemonAPI {
```

El metodo resultante va a ser este:

```java
@Override
public Call<PokemonByIdResponse> getPokemonById(String id) {
    return null;
}
```

Esto se debe porque en nuestra interfaz teníamos lo siguiente:

```java
@GET("pokemon/{id}")
Call<PokemonByIdResponse> getPokemonById(@Path("id") String id);
```

Volviendo al método implementado en nuestro loader, necesitamos que retorne un objeto Call<PokemonByIdResponse> y para ello hacemos la llamada que teníamos en nuestra actividad previamente:

```java
@Override
public Call<PokemonByIdResponse> getPokemonById(String id) {
   return pokemonAPI.getPokemonById(id);
}
```

Siendo pokemonAPI nuestro objeto global declarado al inicio de la clase loader.

## Usemos nuestro loader!
Ahora que tenemos el loader armado, basta con instanciarlo como cualquier otra clase en nuestra actividad:

```java
PokemonLoader loader = new PokemonLoader();
```

Luego armar el objeto call:

```java
Call<PokemonByIdResponse> call = loader.getPokemonById(pokemonId);
```

Y luego llamar al método de call que nos inicia el servicio:

```java
call.enqueue(new Callback <PokemonByIdResponse> () {
    @Override
    public void onResponse(Call <PokemonByIdResponse> call, Response <PokemonByIdResponse> response) {
 
    }
    @Override
    public void onFailure(Call <PokemonByIdResponse> call, Throwable t) {}
});
```

Como ven, nos ahorramos toda la llamada a retrofit, y con una clase Loader ya instanciada, podemos llamar a todos los métodos sin volver a crear toda la implementación de Retrofit.