我正在使用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);
}
}
还有其他办法吗?
答案 0 :(得分: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
是否已取消(如上所示),否则您将对错误有误报。
我认为可以使用相同的方法来中止大文件的下载。