【问题标题】:Accessing OkHttpClient Response from multiple threads从多个线程访问 OkHttpClient 响应
【发布时间】:2019-05-31 15:37:10
【问题描述】:

我想使用PipedOutputStreamPipedInputStream 流式传输响应正文。我不太确定它在多线程方面是否安全。将从不同的线程访问响应。


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() 方法是否安全?

【问题讨论】:

    标签: java okhttp okhttp3


    【解决方案1】:

    是的!您可以将 Response 对象传递给其他线程。唯一的规则是您不能有多个线程同时访问响应正文。

    您可能想看看 Okio 中的 Pipe。它比 java.io 管道的东西更强大。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多