Quiero usar Retrofit 2.1.0 para mi próximo proyecto de Android. Me gustaría usar Design Pattern y, por lo tanto, crear clases separadas para cada llamada REST, es decir,

IBalanceService.java

public Interface IBalanceService{
  @GET("users/{username}")
  void getUser(@Path("username") String username, Callback<User> cb);
}  

BalanceRestClient.java

public class BalanceRestClient{  

  String username = "Makarov";  

  Retrofit retrofit = new Retrofit.Builder()
                               .baseUrl("http://hovermind.com")
                               .addConverterFactory(GsonConverterFactory.create())
                               .addCallAdapterFactory(rxAdapter)
                               .build();  

  IBalanceService bs = retrofit.create(IBalanceService.class);


  Call<User> call = apiService.getUser(username);
  call.enqueue(new Callback<User>() {  

      @Override
      public void onResponse(Call<User> call, Response<User> response) {

          User user = response.body();  

          // update Activity/Fragment from here  

      }

      @Override
      public void onFailure(Call<User> call, Throwable t) {
        // Log error here since request failed
      }  

   });
}

BalanceActivity.java

public BalanceActivity extends Activity{

   // BalanceRestClient will update some UI elements 
}  

¿Cómo puedo actualizar la IU en mi Actividad / fragmento desde onResponse ()?

Información adicional:
mínimo SDK: 19
SDK de destino: 23
Reequipar 2.1.0 con OkHttp y gson

2
HASSAN MD TAREQ 15 dic. 2016 a las 11:57

2 respuestas

La mejor respuesta
 public class BalanceRestClient {

            private static BalanceRestClient instance;
            private IBalanceService request;

            private BalanceRestClient() {
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("http://hovermind.com")
                        .addConverterFactory(GsonConverterFactory.create())
                        .addCallAdapterFactory(rxAdapter)
                        .build();

                request = retrofit.create(IBalanceService.class);
            }

            public static synchronized BalanceRestClient getInstance() {
                if (instance == null)
                    instance = new BalanceRestClient();

                return instance;
            }

            public void getRequest(String userName, YourCustomeCallback callback) {

                Call<User> call = apiService.getUser(username);
                call.enqueue(new Callback<User>() {

                    @Override
                    public void onResponse(Call<User> call, Response<User> response) {

                        User user = response.body();

                        callback.onResponse(user);

                    }

                    @Override
                    public void onFailure(Call<User> call, Throwable t) {
                        // Log error here since request failed
                    }

                });
            }
        }
  1. Crea una clase singleton. Es init una solicitud solo una vez.
  2. Cree una devolución de llamada personalizada, que le devolverá su respuesta a la interfaz de usuario.
  3. Llame a BalanceRestClient.getInstance.getRequest (params ..) donde desee usarlo.
2
Robert Banyai 15 dic. 2016 a las 09:08

Cree una interfaz como esta en:

public interface BalanceListener {

    void onUserAvailable(User user);

}

En su BalanceRestClient tenga una instancia de él. Y en onResponse :

  @Override
  public void onResponse(Call<User> call, Response<User> response) {

      User user = response.body();  

      listener.onUserAvailable(user);

  }

Haga que su actividad implemente BalanceListner :

 public class BalanceActivity extends Activity implements BalanceListener {
                ......

        @Override
        public void onUserAvailable(User user) {
            // update user views here
        }
    }
0
Todor Kostov 15 dic. 2016 a las 09:10