2015-10-30 19 views
6

OkHttp kullanarak bir Server-Sent Events kitaplığı uyguluyorum. Sunucu Gönderilen Olaylar, 'olayların' istemciye geri aktarılabileceği sunucuya açık bir HTTP bağlantısı tutarak çalışır. Bağlantı sadece hataları kapatır veya istemci açıkça bağlantıyı keserse.Streaming okhttp yanıt kütlesi

Bu akış davranışını OkHttp kullanarak elde etmenin en iyi yolu nedir? Sonunda write() günlük mesajı göreceksiniz Bu yaklaşımla

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()"); 
    } 
}); 

, ancak bazen uzunca bir süre (dakika) alabilir: Ben böyle bir şey yapmak teşebbüs ettik. Bu bana kaputun altında bir miktar tamponlama olabileceğini düşünüyor ve arabamı temizleyene kadar veriyi alamıyorum.

Sunucunun doğru çalıştığını doğrulamak için curl kullanıyorum. numaralı veri zamanında gönderilmekte olup, geri geldiğinde geri çağırmadım.

OkHttp ve Okio ile olan deneyimim çok sınırlıdır, bu yüzden bir şeyleri karıştırdım ya da bir seçenek belirlemeyi unutmuşum. Herhangi bir yardım büyük beğeni topluyor! 0

+0

Bu kitaplık bir yerde mevcut mu? :) – wblaschko

cevap

9

readAll()'u aradığınızda Okio, gecikmeli net erişim hacmini tercih eder ve böylece iletileriniz parçalar halinde arabelleğe alınır. Bunun yerine, Buffer'a tekrar tekrar okur. Bu size mesaj geldiğinde ulaşır.

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

Bir çekicilik gibi çalışır! Teşekkürler :) –