【问题标题】:How to get intermediate response from Retrofit API call?如何从 Retrofit API 调用中获得中间响应?
【发布时间】:2021-10-19 22:54:11
【问题描述】:

我使用 Retrofit 进行 API 调用。除了返回大约 15k 条记录的巨大响应之外,所有 API 调用都运行良好。

问题是通话进度条无限显示,直到我得到响应。并且响应太大而导致 OOM 异常。

作为一个解决方案,我发现需要使用@Streaming 注解。我使用了它,但没有得到中间回调。我希望 API 应该一一返回响应块。

请帮帮我。

public static ServiceInterface getServiceAPIClient() {

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    Gson gson = new GsonBuilder()
            .setLenient()
            .create();
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(
                    new Interceptor() {
                        @Override
                        public Response intercept(Interceptor.Chain chain) throws IOException {
                            Request request = chain.request();
                            Request.Builder builder = request.newBuilder();

                            builder = request.newBuilder();
                            if (!TextUtils.isEmpty(PrefsHelper.getAccessTokenEdrm())) {
                                builder.addHeader(AUTHORIZATION, PrefsHelper.getAccessTokenEdrm());
                            }
                            builder.addHeader(API_VERSION, "1.0")
                                    .addHeader("Accept", "application/json");
                            request = builder.build();

                            return chain.proceed(request);
                        }
                    }).connectTimeout(5, TimeUnit.MINUTES) .readTimeout(5, TimeUnit.MINUTES).addInterceptor(interceptor)
            .build();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API_BASE_URL)
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .client(client)
            .build();

    return retrofit.create(ServiceInterface.class);
}

API方法

@POST(EdrmConstants.SEARCH_DOCUMENTS)
    @Streaming
    Observable<ResponseBody> searchDocuments(@Body DocumentRequest documentRequest);

【问题讨论】:

  • 我认为你应该添加分页以获得良好的性能。
  • 使用带有分页的 MVVM 架构,可以有效地加载您的数据。检查this

标签: android retrofit retrofit2


【解决方案1】:

15k 记录太匹配了。 Retrofit 需要时间来发出 http 请求并对你的 ResponseBody.class 进行序列化

我确定序列化需要花费大量时间。

我想最正确的解决方案是在服务器端编辑请求以拆分具有 200-500 条记录的页面上的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多