¿Cómo puedo hacer peticiones simultáneas más rápido con Retrofit / OkHttp?
Necesito hacer 50 solicitudes HTTP GET tan rápido como sea posible con Retrofit en Android. Estoy utilizando Retrofit con OkHttp. Actualmente, Retrofit está haciendo un trabajo pobre frente a Java ThreadPoolExecutor
y HttpUrlConnection
: unos 50sec para Retrofit y 30sec para HttpUrlConnection
normal para las 50 peticiones, si establezco el tamaño de pool 20 para ThreadPoolExecutor
y para Retrofit / OkHttp establezco okHttpClient.dispatcher().setMaxRequests(20);
.
Si miro logcat puedo ver que Retrofit está haciendo un máximo de 5 peticiones simultáneas no importa lo que establezca en setMaxRequests()
mientras que con ThreadPoolExecutor
hay tantas solicitudes concurrentes como hay hilos de trabajo disponibles.
- Cómo poner en cola las llamadas de la API cuando no está conectado mientras usa Retrofit
- RxJava alternativa para el operador map () para guardar los elementos emitidos
- Android - Configuración de Retrofit / Apache HttpClient para Digest Auth
- Saco de jabón de marco simple y cuerpo
- Cómo analizar la matriz JSON sin ningún objeto en Retrofit?
¿Hay algo que pueda hacer para hacer Retrofit más rápido? No quiero cambiar a HttpUrlConnection
porque Retrofit es tan elegante y fácil de usar.
Editar 1
Intenté proporcionar ThreadPoolExecutor
personalizado a OkHttp pero ninguna mejora del tiempo de esto:
OkHttpClient.Builder builder = new OkHttpClient.Builder(); ExecutorService exec = new ThreadPoolExecutor(20, 20, 1, TimeUnit.HOURS, new LinkedBlockingQueue<>()); Dispatcher d = new Dispatcher(exec); builder.dispatcher(d); OkHttpClient okHttpClient = builder.build(); okHttpClient.dispatcher().setMaxRequests(20);
Editar 2
Hago todas las peticiones al mismo punto final, si esto importa
- Excepción de interrupción de subproceso en modo Multi-ventana
- Renovación de la referencia $ ref de objeto deserializante de JSON a su copia original
- Enviar archivos multiparte con retrofit: 2.0.0-beta1
- Cómo obtener respuesta como String utilizando retrofit sin utilizar GSON o cualquier otra biblioteca en android
- Android- Los datos se asignan en el hilandero pero cuando se selecciona no se muestra el valor en el hilador
- EOFException en Retrofit al ejecutar peticiones PUT síncronas
- Encadenamiento de servicios de Retrofit con soporte de RxJava
- Obtención de información de encabezado con RXJava y Retrofit
Ya que todos van al mismo host, ¿has probado:
okHttpClient.dispatcher().setMaxRequestsPerHost(20);
Dispatcher.setMaxRequestsPerHost
- ¿Cómo configurar la vista de actualización personalizada en SwipeRefreshLayout?
- Rotar Video / MediaPlayer en un TextureView