Retrofit.Callback's success () и failure () в случае двух реализаций интерфейса в одном действии

В настоящее время я пишу приложение, которое подключается к серверу для выполнения запросов POST. По этой причине я создал несколько интерфейсов Retrofit для различных сетевых операций. У меня есть учетная запись: я беру имя пользователя, адрес электронной почты и т. Д., Делаю запрос POST, а затем в качестве окончательного параметра у меня есть обратный вызов (RegistrationResult – это POJO, которое принимает «успех» или «отказ» в переменной класса) , Этот интерфейс выглядит следующим образом:

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); } 

Теперь, поскольку я собираюсь использовать GCM для push-уведомлений, у меня есть другой интерфейс, который отправляет идентификатор регистрации конкретного устройства на сервер и снова получает ответ. Этот интерфейс выглядит следующим образом:

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

Все идет нормально. Проблема возникает, когда я пытаюсь создать реализации обоих интерфейсов в одном классе. Предположим, у меня есть Activity, который по какой-то причине должен использовать реализации обоих интерфейсов. Поэтому у меня есть следующее:

 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) { } } 

Моя проблема такова: где соответствуют переопределенные методы (отказ и успех) интерфейса Retrofit.Callback? Поскольку у меня есть две реализации интерфейсов Retrofit в одной и той же Деятельности, как я могу отличить то, что возвращается, например. Метод success ()? Это ответ от реализации RegistrationInterface или ответ от свойства SendRegIDInterface, который содержится в аргументах метода метода Callback's ()? Пока у меня была реализация интерфейса RegistrationInterface в Activity, все было ясно: аргументы метода success () содержат ответ сервера на запрос регистрации. Теперь, когда я использую вторую реализацию интерфейса (SendRegIDInterface), я смущен!

Или я совершенно ошибаюсь?

Я думаю, вам нужно немного больше разделения. Если вы хотите разместить обратные вызовы в своей деятельности, бизнес-логика будет слишком много работать с элементами, связанными с пользовательским интерфейсом.

Когда я использую Retrofit, я делаю это так (продемонстрирую это с вашим кодом): Во-первых, у меня есть RegistrationClient.java , где я определяю все конечные точки для 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); } 

В этом случае это только одна конечная точка, но будут случаи, когда будет больше, например:

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

Когда я получил своего клиента, я создаю модель для интерфейса. Я бы назвал его RegistrationModel в вашем случае:

 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 } } } 

Затем я бы держал одиночную ссылку на каждую из моделей, используя мой собственный локатор сервисов , или используя инъекцию зависимостей (с кинжалом ). Поэтому из вашей деятельности вызов будет примерно таким:

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

Или если вы добавили свой собственный обратный вызов:

 ... ServiceLocator.getRegistrationModel().connect(country, state, email, password, new RegistrationCallback(boolean result) { // do something. } ); ... 
Intereting Posts
DownloadManager.Request.setNotificationVisibility не работает с jSecurityException: недопустимое значение для видимости: 1 Что такое сокращение, чтобы извлечь строки из кода Android в файл strings.xml в Intellij? Android Alarm Manager с широковещательным приемником, зарегистрированным в коде, а не манифестацией Android HttpsUrlConnection eofexception Датчик температуры на Android Простой экспорт и импорт базы данных SQLite на Android Кнопка Ok для диалога оповещений на Android Определить пользовательские компоненты Android с помощью короткого пространства имен? Протокол, используемый для отправки push-уведомления в Android Скрыть клавиатуру при отправке поиска или выбрать предложение поиска Как выровнять 3 кнопки в строке, Android? Android Studio: эмулятор уже запущен RadioGroup, setEnabled (false) не работает! Могу ли я создать резервную копию физического телефона и восстановить эмулятор? Как избежать получения пользователем собственного уведомления gcm чата на Pubnub