Доступ к ответу OkHttpClient из нескольких потоков - PullRequest
0 голосов
/ 12 марта 2019

Я хотел бы использовать 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()?

1 Ответ

1 голос
/ 13 марта 2019

Да!Вы можете передавать объекты Response другим потокам.Единственное правило: нельзя иметь несколько потоков, одновременно обращающихся к телу ответа.

Возможно, вы захотите взглянуть на Pipe в Okio.Он немного более способный, чем труба java.io.

...