[英]How can I make concurrent requests faster with Retrofit / OkHttp?
我需要使用 Android 中的 Retrofit 尽快发出 50 个 http GET 请求。 我正在使用带有 OkHttp 的 Retrofit。 Currently Retrofit is doing a poor job vs plain Java ThreadPoolExecutor
and HttpUrlConnection
: about 50sec for Retrofit and 30sec for plain HttpUrlConnection
for all 50 requests, if I set the pool size 20 for ThreadPoolExecutor
and for Retrofit / OkHttp I set okHttpClient.dispatcher().setMaxRequests(20);
.
如果我查看 logcat,我可以看到 Retrofit 最多执行 5 个并发请求,无论我在setMaxRequests()
中设置什么,而使用ThreadPoolExecutor
时,并发请求的数量与可用的工作线程一样多。
我能做些什么来让 Retrofit 更快吗? 我不想切换到HttpUrlConnection
因为 Retrofit 是如此优雅且易于使用。
我尝试向 OkHttp 提供自定义ThreadPoolExecutor
但没有时间改进:
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);
如果这很重要,我会向同一个端点发出所有请求
既然他们都去了同一个主人,你试过:
okHttpClient.dispatcher().setMaxRequestsPerHost(20);
dispatcher.maxRequests = 20
和dispatcher.maxRequestsPerHost = 20
都为我完成了这项工作
以一些 Kotlin 为例
package com.package
/**
* Created by touhid on 24/Jan/2022.
*/
object NetworkService {
private val interceptor = HttpLoggingInterceptor().apply {
apply { level = HttpLoggingInterceptor.Level.BODY }
}
private val okClient = OkHttpClient.Builder()
.addInterceptor { chain ->
val token = getToken(chain)
var newRequest = chain.request().newBuilder()
token?.let {
newRequest = newRequest.addHeader("Authorization", "Bearer $it")
newRequest = newRequest.addHeader("Accept", "application/json")
}
chain.proceed(newRequest.build())
}
.addInterceptor(interceptor)
.build().also {
it.dispatcher.maxRequests = 20
it.dispatcher.maxRequestsPerHost = 20
}
private val retrofit = Retrofit.Builder()
.client(okClient)
.baseUrl(Constants.baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
val service: myApiService = retrofit.create(FoodicsApi::class.java)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.