Я использую Rx Android + Retrofit для выполнения http-запроса. Код выглядит следующим образом:
Interceptor headerInterceptor = getHeaderInterceptor();
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.callTimeout(5, TimeUnit.SECONDS)
.addInterceptor(headerInterceptor)
.addInterceptor(httpLoggingInterceptor)
.build();
Gson gson = new GsonBuilder()
.setLenient()
.create();
sRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
Используйте его так:
ApiProvider.provideApi(MyApi.class)
.submit(id, mRequest)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
response -> {
Log.w("tag", "success");
},
throwable -> {
Log.w("tag", "error");
}
);
Я установил connectTimeout / readTimeout / writeTimeout
равным 60 секундам, а callTimeout
равным 5 секундам.
Я знаю, что эта конфигурация может быть неправильной, но я просто хочу получить исключение тайм-аута через 5 секунд, и можно вызвать Log.w("tag", "error");
.
Однако я обнаружил, что эта строка никогда не будет вызываться для моего тестирования. И если я установлю connectionTimeout
на 1 секунду, то эта строка будет вызвана немедленно.
Так что же мне делать, если я хочу, чтобы callTimeout вызывал строку ошибки журнала?