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í:
- Generar errores con XML a la dependencia del convertidor de objetos de java en build.gradle para retroadaptación
- Android Fused Location API - cómo utilizar PRIORITY_BALANCED_POWER_ACCURACY y PRIORITY_HIGH_ACCURACY en una aplicación?
- Detección de presencia de FPU en Android
- ¿Cómo cambio entre el GPS y el proveedor de la red?
- ¿Cómo publicar una solicitud de HTTPS utilizando Retrofit?
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?
- Parametrización de Android @Headers
- ¿Utilizando appMobi puedo crear aplicaciones para Android y aplicaciones para iPhone de forma gratuita (además de los costos de Google / Apple)?
- ¿por qué se muestra el mensaje no registrado de la aplicación de Android al iniciar sesión con gmail en la aplicación android?
- Implicaciones de la compatibilidad con varios usuarios de Android (nueva en 4.2) para el modelo de datos del lado del servidor (por ejemplo, android_id)
- Lista de lecturas <Item> con retrofit de XML API
- "Servicios del sistema no disponibles para Actividades antes de onCreate ()" ¿Mensaje de error?
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:
-
GET /persons/{id}
-
POST /persons/
-
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. } ); ...