【问题标题】:Chunked streaming not behaving as expected Retrofit+RxJava分块流的行为不符合预期 Retrofit+RxJava
【发布时间】:2017-05-05 01:37:25
【问题描述】:
@GET("poll/session/{sessionId}/details")
Observable getSessionDetails(@Path("sessionId") String sessionId);

@GET("poll/session/{sessionId}/details")
@Streaming
Observable getSessionDetails(@Path("sessionId") String sessionId);

@Override
public Observable getSessionDetails(String sessionId) {
return sessionAPI.getSessionDetails(sessionId)
.flatMap(responseBody -> events(responseBody.source()));
}

public static Observable<String> events(BufferedSource source) {
    return Observable.create(subscriber -> {
        try {
            while (!source.exhausted()) {
                subscriber.onNext(source.readUtf8Line());
            }
        } catch (IOException e) {
            e.printStackTrace();
            subscriber.onError(e);
        }
        subscriber.onCompleted();
    });
}

除非所有块都完成,否则不会调用 events() 方法。

但预计分块流将逐块传送,这似乎没有发生。

我尝试过对 API 使用和不使用 @Streaming 注释,但行为是相同的。

我曾使用Android Retrofit 2 + RxJava: listen to endless stream 作为参考来执行我的实现

【问题讨论】:

    标签: android rest rx-java retrofit2


    【解决方案1】:

    好吧,伙计们,我找到了答案。这是因为我正在使用 Body 属性进行日志记录

    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    

    所以,由于记录器正在等待整个主体打印它,它的行为方式与问题中提到的一样。

    参考:Square's Retrofit response parsing logic: streaming?

    【讨论】:

    • 谢谢!尝试调试它时我几乎失去了理智。
    • 乐于助人:)。这让我疯狂了至少几天
    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2021-04-09
    相关资源
    最近更新 更多