即使使用Keep-Alive标头,使用okhttp的改版也极其缓慢

时间:2019-07-19 22:19:15

标签: android google-cloud-firestore retrofit2 okhttp3

当我通过改造下载json文件时,每次都会花费太多时间。

我正在使用okhttp进行改造,以获取json数据并显示在recyclerview中。我也在使用拦截器来包含保持活动的标头。但是,与Google的firestore数据库相比,请求需要花费大量时间。我认为保持活动状态无法正常工作,每个请求都打开了新的连接,这就是为什么加载时间太长的原因。

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秒钟,而翻新中的400 kb文件花费了很长时间,因此应用程序实际上就冻结了。

我使用Glide加载图像,而Glide用不到2秒的时间即可加载100kb图像。

所以我想我在这里犯了严重的错误,因为Glide相当快,firestore相当快,只有用okhttp改造才很慢。

有人可以告诉我这里做错了什么吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

好的,我解决了它,当我通过改造下载了一个普通文件并通过InputStream读取它时,它花费的时间太长了。但是,当以json格式访问相同的数据时,花费的时间不超过1秒。我认为改造应该只用于获取json数据,而不是普通文件。