DEV Community

Maximiliano Burgos
Maximiliano Burgos

Posted on • Edited on

Loader para Retrofit

Antes de leer este artículo, te recomiendo que pases por acá, donde te enseño a Como Implementar Retrofit.

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:

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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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:

public class PokemonLoader implements PokemonAPI {
Enter fullscreen mode Exit fullscreen mode

El metodo resultante va a ser este:

@Override
public Call<PokemonByIdResponse> getPokemonById(String id) {
    return null;
}
Enter fullscreen mode Exit fullscreen mode

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

@GET("pokemon/{id}")
Call<PokemonByIdResponse> getPokemonById(@Path("id") String id);
Enter fullscreen mode Exit fullscreen mode

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

@Override
public Call<PokemonByIdResponse> getPokemonById(String id) {
   return pokemonAPI.getPokemonById(id);
}
Enter fullscreen mode Exit fullscreen mode

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:

PokemonLoader loader = new PokemonLoader();
Enter fullscreen mode Exit fullscreen mode

Luego armar el objeto call:

Call<PokemonByIdResponse> call = loader.getPokemonById(pokemonId);
Enter fullscreen mode Exit fullscreen mode

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

call.enqueue(new Callback <PokemonByIdResponse> () {
    @Override
    public void onResponse(Call <PokemonByIdResponse> call, Response <PokemonByIdResponse> response) {

    }
    @Override
    public void onFailure(Call <PokemonByIdResponse> call, Throwable t) {}
});
Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)