@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注释,也可以不使用@Streaming注释。

我已经使用Android Retrofit 2 + RxJava: listen to endless stream作为实现的引用

最佳答案

好的,我找到了答案。这是因为我正在使用“ body ”属性进行记录

logging.setLevel(HttpLoggingInterceptor.Level.BODY);

因此,由于记录器正在等待整个 body 进行打印,因此它的行为与问题中提到的方式相同。

引用:Square's Retrofit response parsing logic: streaming?

10-08 06:46