El éxito de Retrofit.Callback () y el fallo () en caso de dos implementaciones de interfaz en la misma Actividad

Actualmente estoy escribiendo una aplicación que se conecta a un servidor para realizar solicitudes POST. Por esta razón, he creado múltiples interfaces de Retrofit para diversas operaciones de red. Tengo uno que realiza el registro: Tomo el nombre de usuario, correo electrónico etc, hacer una solicitud POST y luego como un parámetro final Tengo una devolución de llamada (RegistrationResult es un POJO que acepta "éxito" o "fracaso" en una variable de clase) . Esta interfaz se ve así:

public interface RegistrationInterface { @FormUrlEncoded @POST("/api/apiregistration.php") void connect(@Field("country") String country, @Field("state") String state, @Field("email") String email, @Field("pwd") String password, Callback<RegistrationResult> resp); } 

Ahora, porque voy a usar GCM para notificaciones push, tengo otra interfaz que envía la identificación de registro del dispositivo en particular al servidor y, de nuevo, obtiene una respuesta de nuevo. Esa interfaz se ve así:

 public interface SendRegIDInterface { @FormUrlEncoded @POST("/api/apiregid.php") void connect(@Field("reg_id") String reg_id, Callback<RegIDResult> resp); } 

Hasta aquí todo bien. El problema surge cuando intento crear implementaciones de ambas interfaces en la misma clase. Digamos que tengo una actividad que, por alguna razón, debería usar implementaciones de ambas interfaces. Así que tengo esto:

 public class MessageActivity extends Activity implements Callback { public void onCreate(Bundle firebug) { RestAdapter restAdapter1 = new RestAdapter.Builder().setEndpoint(endpoint).build(); RegistrationInterface regInter = restAdapter1.create(RegistrationInterface.class); regInter.connect(// parameters here, MessageActivity.this); RestAdapter restAdapter2 = new RestAdapter.Builder().setEndpoint(endpoint).build(); SendRegIDInterface regIDInter = restAdapter2.create(SendRegIDInterface.class); regIDInter.connect(reg_id, MessageActivity.this); } @Override public void failure(RetrofitError arg0) { } @Override public void success(Object arg0, Response arg1) { } } 

Mi problema es esto: ¿dónde se corresponden los métodos anulados (fallo y éxito) de la interfaz Retrofit.Callback? Ya que estoy teniendo dos implementaciones de interfaces de Retrofit en la misma actividad, ¿cómo puedo distinguir lo que se devuelve en, por ejemplo. el método de éxito ()? ¿Es la respuesta de la aplicación RegistrationInterface o la respuesta de SendRegIDInterface contenida en los argumentos del método de éxito de devolución de llamada ()? Siempre y cuando sólo tuviera una implementación de la interfaz RegistrationInterface en la actividad, todo estaba claro: los argumentos del método success () contienen la respuesta del servidor a la solicitud de registro. Ahora que estoy usando una segunda aplicación de interfaz (SendRegIDInterface) estoy super confundido!

¿O me estoy equivocando completamente con esto?

Creo que necesitas un poco más de separación. Si desea colocar las devoluciones de llamada en su actividad, la lógica de negocio se ensucia demasiado con las cosas relacionadas con la interfaz de usuario.

Cuando uso Retrofit lo hago de esta manera (lo demostraré con su código): Primero, tengo un RegistrationClient.java , donde defino todos los puntos finales de la API:

 public interface RegistrationClient { @FormUrlEncoded @POST("/api/apiregistration.php") void connect(@Field("country") String country, @Field("state") String state, @Field("email") String email, @Field("pwd") String password, Callback<RegistrationResult> resp); } 

En este caso, es sólo un punto final, pero habrá casos, donde habrá más, por ejemplo:

  1. GET /persons/{id}
  2. POST /persons/
  3. PUT /persons/{id}

Cuando conseguí mi cliente, entonces creo un modelo para la interfaz. Lo nombraré RegistrationModel en su caso:

 public class RegistrationModel { private RegistrationClient _client; public RegistrationModel() { RestAdapter restAdapter = new RestAdapter.Builder() ... // create an adapter _client = restAdapter.create(RegistrationClient.class); } public void connect(String country, String state, String email, String password) { // you can add an additional callback parameter for returning info to the caller. _client.connect(country, state, email, password, new Callback<RegistrationResult> { @Override public void failure(RetrofitError error) { // Do the essential things, and do a callback to the caller if needed } @Override public void success(RegistrationResult result, Response response) { // Do the essential things, and do a callback to the caller if needed } } } 

Entonces tendría una referencia singleton a cada uno de los modelos usando un localizador de mi propio servicio , o utilizando la inyección de dependencia (con Dagger ). Así que de su actividad, la llamada sería algo como esto:

 ... ServiceLocator.getRegistrationModel().connect(country, state, email, password); ... 

O si agregó su propia devolución de llamada:

 ... ServiceLocator.getRegistrationModel().connect(country, state, email, password, new RegistrationCallback(boolean result) { // do something. } ); ... 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.