2015-10-30 17 views
6

Tôi đang triển khai thư viện Server-Sent Events bằng OkHttp. Sự kiện được gửi của máy chủ hoạt động bằng cách giữ kết nối HTTP mở với máy chủ mà trên đó các sự kiện có thể được phát lại cho máy khách. Kết nối sẽ chỉ đóng trên các lỗi hoặc nếu máy khách ngắt kết nối rõ ràng.Truyền trực tiếp nội dung phản hồi okhttp

Cách tốt nhất để đạt được hành vi phát trực tuyến này bằng cách sử dụng OkHttp là gì? Tôi đã cố gắng để làm một cái gì đó như:

response.body().source().readAll(new Sink() { 
    @Override 
    public void write(Buffer source, long byteCount) throws IOException { 
    Log.d(TAG, "write(): byteCount = "+byteCount); 
    } 

    @Override 
    public void flush() throws IOException { 
    Log.d(TAG, "flush()"); 
    } 

    @Override 
    public Timeout timeout() { 
    return Timeout.NONE; 
    } 

    @Override 
    public void close() throws IOException { 
    Log.d(TAG, "close()"); 
    } 
}); 

Với phương pháp này, tôi cuối cùng sẽ thấy thông báo đăng nhập write(), nhưng đôi khi nó có thể mất nhiều thời gian (phút). Điều đó làm cho tôi nghĩ rằng có thể có một số đệm đang xảy ra dưới mui xe và tôi không nhận được dữ liệu của tôi cho đến khi bộ đệm được đỏ bừng.

Tôi đã sử dụng curl để xác minh máy chủ hoạt động chính xác. Dữ liệu được gửi đúng giờ, tôi không nhận được cuộc gọi lại khi đến.

Trải nghiệm của tôi với OkHttpOkio rất hạn chế, vì vậy rất có thể tôi đã làm hỏng điều gì đó hoặc đã quên đặt một số tùy chọn. Bất kỳ trợ giúp nào cũng được đánh giá rất cao! :)

+0

Thư viện này có sẵn ở đâu đó không? :) – wblaschko

Trả lời

9

Khi bạn gọi readAll() Okio thích thông lượng ròng qua độ trễ và do đó thư của bạn được lưu vào bộ đệm. Thay vào đó, viết một vòng lặp liên tục đọc vào một Buffer. Điều đó sẽ giúp bạn nhận được tin nhắn khi họ đến.

Buffer buffer = new Buffer(); 
while (!source.exhausted()) { 
    long count = response.body().source().read(buffer, 8192); 
    // handle data in buffer. 
} 
+0

Hoạt động như một sự quyến rũ! Cảm ơn :) –

Các vấn đề liên quan