即使在 Keep-Alive header 之后,使用 okhttp 进行改造也非常慢
Retrofit with okhttp is extremely slow even after Keep-Alive header
当我使用 retrofit 下载 json 个文件时,每次都花费太多时间。
我正在使用 okhttp 的改造来获取 json 数据并显示在 recyclerview 中。我也在使用拦截器来包含 keep-alive header。然而,与 google 的 firestore 数据库相比,请求需要花费很多时间。我认为 keep alive 工作不正常,每个请求都打开新连接,这就是加载时间过长的原因。
Api代码:
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
ConnectionPool connectionPool = new ConnectionPool(10, 10, TimeUnit.MINUTES);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.connectionPool(connectionPool)
.connectTimeout(5, TimeUnit.MINUTES)
.readTimeout(5, TimeUnit.MINUTES);
httpClient.interceptors().add(logging);
httpClient.interceptors().add(new Interceptor() {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws
IOException {
Request original = chain.request();
// Customize the request
Request request = original.newBuilder()
.header("Connection", "Keep-Alive")
.method(original.method(), original.body())
.build();
Response response = chain.proceed(request);
if (!response.isSuccessful() || response.code()==503) {
connectionPool.evictAll();
return chain.proceed(request);
} else {
// Customize or return the response
return response;
}
}
});
OkHttpClient client = httpClient.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
postService = retrofit.create(PostService.class);
public interface PostService {
@POST
Call<PostList> getPostList(@Url String url);
}
当我使用此代码时,通过 10mbps wifi 连接甚至 4G 连接加载 40kb 文件需要 8 多秒。而从 firebase firestore 加载相同的数据几乎不需要 1 秒。
事实上,我从 firestore 查询了 400kb 数据,加载只用了 4 秒,而从改造中查询 400kb 文件需要很长时间,以至于应用程序完全冻结。
我使用 Glide 加载图片,Glide 加载 100kb 的图片不到 2 秒。
所以我想我在这里做错了一些事情,因为 Glide 非常快,firestore 非常快,只有使用 okhttp 进行改造非常慢。
谁能告诉我这里做错了什么?
谢谢。
好的我解决了,当我通过改装下载一个普通文件并通过InputStream读取它时,它花费的时间太长了。但是当以 json 格式访问相同的数据时,花费的时间不超过 1 秒。我认为改造应该只用于获取 json 数据而不是普通文件。
当我使用 retrofit 下载 json 个文件时,每次都花费太多时间。
我正在使用 okhttp 的改造来获取 json 数据并显示在 recyclerview 中。我也在使用拦截器来包含 keep-alive header。然而,与 google 的 firestore 数据库相比,请求需要花费很多时间。我认为 keep alive 工作不正常,每个请求都打开新连接,这就是加载时间过长的原因。
Api代码:
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
ConnectionPool connectionPool = new ConnectionPool(10, 10, TimeUnit.MINUTES);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.connectionPool(connectionPool)
.connectTimeout(5, TimeUnit.MINUTES)
.readTimeout(5, TimeUnit.MINUTES);
httpClient.interceptors().add(logging);
httpClient.interceptors().add(new Interceptor() {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws
IOException {
Request original = chain.request();
// Customize the request
Request request = original.newBuilder()
.header("Connection", "Keep-Alive")
.method(original.method(), original.body())
.build();
Response response = chain.proceed(request);
if (!response.isSuccessful() || response.code()==503) {
connectionPool.evictAll();
return chain.proceed(request);
} else {
// Customize or return the response
return response;
}
}
});
OkHttpClient client = httpClient.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
postService = retrofit.create(PostService.class);
public interface PostService {
@POST
Call<PostList> getPostList(@Url String url);
}
当我使用此代码时,通过 10mbps wifi 连接甚至 4G 连接加载 40kb 文件需要 8 多秒。而从 firebase firestore 加载相同的数据几乎不需要 1 秒。
事实上,我从 firestore 查询了 400kb 数据,加载只用了 4 秒,而从改造中查询 400kb 文件需要很长时间,以至于应用程序完全冻结。
我使用 Glide 加载图片,Glide 加载 100kb 的图片不到 2 秒。
所以我想我在这里做错了一些事情,因为 Glide 非常快,firestore 非常快,只有使用 okhttp 进行改造非常慢。
谁能告诉我这里做错了什么?
谢谢。
好的我解决了,当我通过改装下载一个普通文件并通过InputStream读取它时,它花费的时间太长了。但是当以 json 格式访问相同的数据时,花费的时间不超过 1 秒。我认为改造应该只用于获取 json 数据而不是普通文件。