Android Retrofit — обратный вызов или отсутствие обратного звонка

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

 public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@Path("user") String user);
}

и вот пример с обратным вызовом (надеюсь, я правильно понял):

   public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@Path("user") String user,Callback<Repo> cb);
}

Меня смущают две вещи:

  1. Возвращаемое значение в интерфейсе — это список, но для меня оно должно быть недействительным, потому что модификация будет использовать gson для преобразования ответа json в POJO репо. Все, что мне нужно сделать, это создать Repo POJO, поэтому я ожидаю, что последний фрагмент кода будет таким:

    открытый интерфейс GitHubService {

    @GET("/пользователи/{пользователь}/репо")

    void listRepos(@Path("user") String user,Callback cb); }

Какова цель возвращаемого значения?

  1. мой второй вопрос: нужен ли обратный вызов только для того, чтобы узнать, был ли запрос успешным или неудачным, как я вижу из документов, у обратного вызова есть два метода: сбой и успех.

person j2emanue    schedule 19.06.2015    source источник


Ответы (1)


Я хочу попытаться ответить на ваш вопрос

1. Вы правы, возвращаемое значение должно быть void, так как вы получите ответ от Callback

2. Да, Callback нужен для проверки успешности запроса, а также для получения ответа сервера.

Надеюсь, это будет полезно!


EDIT: вы можете использовать прямое возвращаемое значение или использовать обратные вызовы для получения ответа. Цитата с сайта документации по модернизации:

  • Метод с возвращаемым типом будет выполняться синхронно.
  • Асинхронное выполнение требует, чтобы последним параметром метода был обратный вызов.

Итак, я думаю, что документация действительно отвечает на этот вопрос, обратный вызов необходим, если вы хотите, чтобы выполнение было асинхронным: D

person reidzeibel    schedule 19.06.2015
comment
это отличное подтверждение спасибо. Но если вы посмотрите примеры здесь square.github.io/retrofit, вы увидите в самом В первом примере они используют возвращаемый тип List‹Repo› вместо void. Как используется возвращаемый тип. - person j2emanue; 19.06.2015
comment
Привет, я отредактировал свой ответ, проверьте его, я получил ответ из Synchronous vs. Asynchronous vs. Observable части документации на их сайте: D - person reidzeibel; 19.06.2015
comment
если вы не передаете обратный вызов, вам нужно поймать RetrofitError, иначе ваш код выйдет из строя при возникновении какой-либо ошибки. - person The-null-Pointer-; 19.10.2015
comment
@ The-null-Pointer- Где и как я могу перехватить исключения Retrofit, если я не могу использовать обратные вызовы? Я попробовал функцию перехвата перехватчика, но там я должен доставить ответ, которого у меня нет, когда произошло исключение. Если я этого не делаю, Retrofit выдает исключение нулевого указателя. - person The incredible Jan; 12.10.2020