Я хотел бы использовать PipedOutputStream и PipedInputStream для потоковой передачи тела ответа.Я не совсем уверен, безопасно ли это с точки зрения многопоточности.Ответ будет доступен из другого потока.
public Streamer execute() {
Response response = null;
try {
Call call = client.newCall(request);
response = call.execute();
return stream(response);
} catch (Exception e) {
if (response != null) response.close();
}
}
@FunctionalInterface
interface Streamer {
void write(OutputStream out) throws Exception;
}
private static Streamer stream(Response response) throws IOException {
return out -> {
// will be executed from a different thread
try (BufferedSource source = response.body().source();
Buffer buffer = new Buffer()) {
BufferedSink sink = Okio.buffer(Okio.sink(out));
long readBytes;
long readTotal = 0;
while ((readBytes = source.read(buffer, BUFFER_SIZE)) != -1) {
sink.write(buffer, readBytes);
sink.flush();
readTotal += readBytes;
}
}
};
}
Безопасно передать объект Response
в другой поток и получить доступ к методам body()
и body().close()
?