【问题标题】:How to abort large file upload with OkHttp?如何使用 OkHttp 中止大文件上传?
【发布时间】:2016-06-20 00:02:00
【问题描述】:

我正在使用 OkHttp 3.1.2。 我创建了类似于原始配方的文件上传,可在此处找到:https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/PostMultipart.java

我找不到如何根据用户请求中止上传大文件的示例。我的意思不是如何获取用户请求,而是如何告诉 OkHttp 停止发送数据。 到目前为止,我能想到的唯一解决方案是使用自定义RequestBody,添加一个abort() 方法并覆盖writeTo() 方法,如下所示:

public void abort() {
    aborted = true;
}

@Override
public void writeTo(BufferedSink sink) throws IOException {
    Source source = null;
    try {
        source = Okio.source(mFile);
        long transferred = 0;
        long read;

        while (!aborted && (read = source.read(sink.buffer(), SEGMENT_SIZE)) != -1) {
            transferred += read;
            sink.flush();
            mListener.transferredSoFar(transferred);

        }
    } finally {
        Util.closeQuietly(source);
    }
}

还有其他方法吗?

【问题讨论】:

    标签: java okhttp3


    【解决方案1】:

    事实证明这很容易:

    只需保持对Call 对象的引用并在需要时取消它,如下所示:

    private Call mCall;
    
    
    private void executeRequest (Request request) {
        mCall = mOkHttpClient.newCall(request);
        try {
            Response response = mCall.execute();
            ...
        } catch (IOException e) {
            if (!mCall.isCanceled()) {
                mLogger.error("Error uploading file: {}", e);
                uploadFailed(); // notify whoever is needed
            }
        }
    }
    
    
    public void abortUpload() {
        if (mCall != null) {
            mCall.cancel();
        }
    }
    

    请注意,当您在上传时取消Call 时会抛出IOException,因此您必须检查catch 是否已取消(如上所示),否则您将误报错误。

    我认为同样的方法可以用于中止大文件的下载。

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 2014-08-08
      • 2015-08-01
      • 2021-01-19
      • 2012-02-20
      • 2020-05-08
      • 2016-06-29
      • 2016-02-26
      相关资源
      最近更新 更多