Okhttp ignora la configuración de Dispatcher cuando se usa con Retrofit RxJavaCallAdapterFactory

Considere las siguientes inicializaciones de OkHttp y Retrofit:

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() } 

Al probar las llamadas de descanso, he notado que Okhttp no respeta la configuración setMaxRequestsPerHost o setMaxRequests en absoluto. Aquí está el registro de 3 solicitudes enviadas simultáneamente:

 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) 

Donde XXX es el mismo dominio, 1/2/3 son caminos diferentes.

No estoy seguro de por qué, pero pensé que esto tiene que ver con el programador de RxJava establecido en addCallAdapterFactory.

¿Es esto un error? ¿O me estoy perdiendo algo?

Estoy usando okhttp 3.4.1, y retrofit 2.1.0.

Para citar a Jake Wharton sobre este tema:

La implementación de Observable para Retrofit ejecuta peticiones que dependen de forma sincronizada del Programador aplicado para cualquier limitación necesaria. Si necesita los límites de Dispatcher de OkHttp para ser honrado, entonces tendrá que escribir un CallAdapter personalizado para Observable que utiliza Call.enqueue en lugar de Call.execute.

Actualmente no tenemos planes para apoyar esto, aunque es probable que Retrofit v3 construido sobre un hipotético OkHttp v4 podría hacer que este sea el valor predeterminado (aunque esto es un largo camino).

Este es el mismo comportamiento que vería si utilizó Retrofit's Call y llamó .execute (), o incluso usó la llamada de OkHttp con su .execute ().

  • Cómo emitir elementos de una lista con retraso en RxJava?
  • RxJava y datos almacenados en caché
  • Por qué definir Flowable podría recibir actualizaciones de la base de datos
  • Compruebe que el método se llama en onNext del suscriptor de RxJava
  • Inter fragmento de comunicación utilizando rxjava
  • Schedulers.immediate () no funciona con las pruebas de gradle de la línea de comandos
  • AndroidRX - ejecuta el método en segundo plano
  • MVP de Android con RxAndroid + Retrofit
  • Cuándo cancelar una suscripción
  • RxJava2 función de rebote no funciona correctamente en RecyclerView - Android
  • Implementar reintento Cuando la lógica
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.