如何使用OkHttp取消大文件上传?

5
我正在使用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);
    }
}

有其他方法吗?
1个回答

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中检查是否已取消(如上所示),否则您将得到错误的结果。
我认为可以使用相同的方法来中止大文件的下载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接