Я пытаюсь использовать недавно добавленную функцию из OkHttp 3.12.0: тайм-ауты для полной операции.Для этого я также полагаюсь на новый класс Invocation
из модификации 2.5.0, который позволяет мне извлекать аннотации методов.
Аннотация:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Timeout {
int value();
TimeUnit unit();
}
Интерфейс модернизации:
public interface AgentApi {
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
@GET("something")
Call<String> getSomething();
}
И перехватчик:
class TimeoutInterceptor implements Interceptor {
@NonNull
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
Request request = chain.request();
final Invocation tag = request.tag(Invocation.class);
final Method method = tag != null ? tag.method() : null;
final Timeout timeout = method != null ? method.getAnnotation(Timeout.class) : null;
if (timeout != null) {
chain.call().timeout().timeout(timeout.value(), timeout.unit());
}
return chain.proceed(request);
}
}
Я правильно добавил TimeoutInterceptor с .addInterceptor(...)
в OkHttpClient, предоставленном для Retrofit Builder.
К сожалению, это не работает, как я ожидал.Вызовы не прерываются при достижении времени ожидания?
Хотя он работает нормально при использовании цепных методов от перехватчика:
chain
.withConnectTimeout(connect, unit)
.withReadTimeout(read, unit)
.withWriteTimeout(write, unit)
Это потому, что время ожидания вызова должно быть установлено довызов поставлен в очередь?(и перехватчик срабатывает слишком поздно в процессе?), или это что-то еще?