2016-07-23 2 views
5

Рассмотрим следующие инициализаций из OkHttp и Дооснащение:Okhttp игнорирует Диспетчер настройки при использовании Retrofit RxJavaCallAdapterFactory

public static SomeServiceRestInterface newRestService(String apiUrl) { 
      Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(apiUrl) 
        .client(createOkHttpClient()) 
        .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) 
        .addConverterFactory(createGsonConverter()) 
        .build(); 
      return retrofit.create(SomeServiceRestInterface.class); 
} 

private static OkHttpClient createOkHttpClient() { 
        Dispatcher dispatcher = new Dispatcher(); 
        dispatcher.setMaxRequestsPerHost(1); 
        dispatcher.setMaxRequests(1); 
        OkHttpClient.Builder builder = new OkHttpClient.Builder() 
           .dispatcher(dispatcher).build() 
} 

При тестировании остальные звонки, я заметил, что Okhttp не чтить setMaxRequestsPerHost или setMaxRequests настройки в все. Вот лог 3 запросов отправляется одновременно:

23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - --> POST https://XXX/1 http/1.1 
23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - Content-Length: 0 
23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - --> END POST (0-byte body) 
23/07 04:14:22.672 [RxIoScheduler-7] DEBUG - --> POST https://XXX/2 http/1.1 
23/07 04:14:22.673 [RxIoScheduler-7] DEBUG - Content-Length: 0 
23/07 04:14:22.673 [RxIoScheduler-7] DEBUG - --> END POST (0-byte body) 
23/07 04:14:22.676 [RxIoScheduler-6] DEBUG - --> POST https://XXX/3 http/1.1 
23/07 04:14:22.677 [RxIoScheduler-6] DEBUG - Content-Length: 0 
23/07 04:14:22.677 [RxIoScheduler-6] DEBUG - --> END POST (0-byte body) 

где XXX является тот же домен, 1/2/3 разные пути.

Я не уверен, почему, но я думал, что это возможно связано с планировщиком RxJava, установленным в addCallAdapterFactory.

Это ошибка? или я что-то упускаю?

Я использую okhttp 3.4.1 и модифицирую 2.1.0.

+0

Вы проверили, сколько клиентов-клиентов вы создаете? –

ответ

4

Цитирую Jake Wharton по этому вопросу:

Реализация Наблюдаемые для Модернизированный выполняет запросы синхронно полагающиеся на прикладном планировщиком для любой обязательно предельному. Если вам нужно, чтобы ограничения от диспетчера OkHttp были равны , вам нужно будет написать собственный CallAdapter для Observable , который использует Call.enque вместо Call.execute.

В настоящее время нет никаких планов по поддержке этого, хотя вполне вероятно, что дооснащения v3 построен на гипотетическом OkHttp v4 может сделать это по умолчанию (хотя это далеко).

Это то же поведение, что и вы, если бы вы использовали функцию Retrofit's Call и вызвали .execute(), или даже использовали вызов OkHttp с его .execute().

Смежные вопросы