Как Retrofit работает под капотом - PullRequest
1 голос
/ 21 февраля 2020

Вопрос относительно Retrofit2:

После создания экземпляра Retrofit вы вызываете один из методов интерфейса (клиента) для «отправки запроса»

Например, если у вас есть такой интерфейс:

@POST("webhook.php")
Call<String>  queueCustomer(@Body String queue);

и экземпляр «клиента» Retrofit, который вы создали с помощью метода create, а затем вызываете его так:

client.queueCustomer(someString)

Я предполагаю, что это фактически делает сетевой запрос. Однако вы берете объект Call, возвращенный из этого, и вызываете что-то вроде:

callObject.enqueue(........)

Делаете ли вы дополнительный сетевой запрос при вызове enqueue? Это два сетевых запроса или первая часть: client.queueCustomer(someString) просто создание объекта, который будет отправлен через callObject.enqueue(........)?

Заранее спасибо

1 Ответ

1 голос
/ 21 февраля 2020

Когда вы настраиваете экземпляр модификации и создаете сервис с помощью Retrofit.create (ApiService :: class. java), тогда реализация интерфейса сервиса создается с помощью прокси-классов. Ниже приведен блок кода из класса Retrofit, который создает реализацию интерфейса службы и объекты вызова. Фактически, дооснащение - это библиотека-оболочка для превращения интерфейсов в вызовы OkHttp. Поэтому, когда вы вызываете метод интерфейса, он просто возвращает вас к соответствующему объекту вызова, но если вы не запустите метод enqueue или execute, он не сделает запрос.

public <T> T create(final Class<T> service) {
    validateServiceInterface(service);
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
          private final Platform platform = Platform.get();
          private final Object[] emptyArgs = new Object[0];

          @Override public @Nullable Object invoke(Object proxy, Method method,
              @Nullable Object[] args) throws Throwable {
            // If the method is a method from Object then defer to normal invocation.
            if (method.getDeclaringClass() == Object.class) {
              return method.invoke(this, args);
            }
            if (platform.isDefaultMethod(method)) {
              return platform.invokeDefaultMethod(method, service, proxy, args);
            }
            return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
          }
        });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...