2017-05-05 35 views
2
@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()方法。分塊流式傳輸不像預期的那樣Retrofit + RxJava

但是塊狀流預計會通過塊傳遞塊,這似乎不會發生。

我已經嘗試過,沒有@Streaming註釋到API,但行爲是相同的。

我曾使用Android Retrofit 2 + RxJava: listen to endless stream作爲參考做我的實現

回答

2

好的傢伙,我找到了答案。這是因爲我用身體登錄屬性

logging.setLevel(HttpLoggingInterceptor.Level.BODY); 

因此,由於記錄器正在等待全身打印出來,它表現爲在問題中提到的方法。

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

+1

感謝您的支持!我幾乎失去了我的想法試圖調試這一點。 – Rosomack

+1

高興地幫助:)。這讓我瘋狂至少幾天 –