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:
- ¿Cómo ejecutar 2 consultas secuencialmente en un Android RxJava Observable?
- ¿Cómo se muestra spinner si RxJava observable toma mucho tiempo?
- Cómo hacer que flatMap se ejecute en un subproceso de fondo
- Operadores RxJava
- Cómo encadenar los métodos groupBy () de RxJava como groupBy (). GroupBy ()
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.
- ¿Cómo actualizar observable en RxJava?
- Creando Observable sin utilizar Observable.create
- ¿Cuál es la manera correcta de burlarse de un RxJava Observable
- ¿Por qué debounce () con toList () no funciona en RxAndroid?
- ¿Cuándo se debe usar RxJava Observable y cuándo Callback simple en Android?
- Uso de Mockito con Retrofit 2.0
- No vuelva a ejecutar la llamada de Retrofit si todavía está en curso con RxJava 2
- RxJava alternativa para el operador map () para guardar los elementos emitidos
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 ().
- Uso de Amazon Simple Storage Service (S3) en Android
- Abre la actividad de correo electrónico y obtén resultados?