我已经使用官方API编写了一个应用程序来上传到Google云端硬盘,这非常有效。但是我无论如何都无法取消上传。我在ASyncTask中运行它,到目前为止,我已尝试制作驱动器对象,文件路径,令牌和其他一些变量。我也尝试使令牌无效,但似乎这只是从缓存中删除它并没有实际上使服务器端无效。我已经在ASyncTask上调用了cancel,但是如果在上传开始时它被取消,那么似乎无法阻止它。
我的问题是,如果用户开始上传100mb文件,他们就无法取消它,除了打开和关闭互联网连接这是不切实际的。这是我的上传代码:
java.io.File jFile = new java.io.File(path); //Does not get file just info
File body = setBody(jFile, mimeType);
try
{
java.io.File mediaFile = new java.io.File(path);
InputStreamContent mediaContent =
new InputStreamContent(mimeType,
new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());
request = drive.files().insert(body, mediaContent);
request.getMediaHttpUploader().setProgressListener(new CustomProgressListener());
File file = request.execute();
肯定有办法取消上传?
答案 0 :(得分:7)
好问题!我提交了一项功能请求,可以取消媒体上传请求:
https://code.google.com/p/google-api-java-client/issues/detail?id=671
但是,根据该库的当前设计,这可能是一项难以实现的功能。
另一个需要考虑的选择是不使用AsyncTask而是自己实现多线程并中止正在运行的Thread。不愉快,但现在可能是你做这件事的唯一选择。
答案 1 :(得分:2)
在评论中我说过将请求放在线程中并且调用中断不起作用。所以我正在寻找另一种方法。
我终于找到一个,一个丑陋的:关闭上传文件的InputStream!
我初始化:
mediaContent = new InputStreamContent(NOTE_MIME_TYPE,new BufferedInputStream(new FileInputStream(fileContent)));
mediaContent.setLength(fileContent.length());
在一个停止听众中,我有:
IOUtils.closeQuietly(mediaContent.getInputStream());
当然,应该可以更好地做到这一点!
此致
答案 2 :(得分:0)
我也一直在寻找答案。以下是我能想到的最好的。
将Future
对象存储在任意位置(使用Object
或Void
):
Future<Object> future;
调用此代码(Java 8):
try
{
ExecutorService executor = Executors.newSingleThreadExecutor();
future = (Future<Object>) executor.submit(() ->
{
// start uploading process here
});
future.get(); // run the thread (blocks)
executor.shutdown();
}
catch (CancellationException | ExecutionException | InterruptedException e)
{}
要取消,请致电:
future.cancel(true);
到目前为止,这个解决方案还没有产生任何令人讨厌的副作用,不像停止一个线程(不推荐使用),并且与中断不同,保证取消。
答案 3 :(得分:-1)
我发现了一种讨厌的方法。 我正在开发一个Android应用程序,但我假设类似的逻辑可以应用于其他平台
我已将progressListener设置为上传请求:
uploader.setProgressListener(new MediaHttpUploaderProgressListener() {
@Override
public void progressChanged(MediaHttpUploader uploader) throws IOException {
if (cancelUpload) {
//This was the only way I found to abort the download
throw new GoogleDriveUploadServiceCancelException("Upload canceled");
}
reportProgress(uploader);
}
});
正如您所看到的,当我需要中止上传时,我使用了从外部设置的布尔成员。 如果此布尔值设置为true,那么在下次更新上载进度时,我将崩溃,从而导致请求中止。
同样,非常难看,但这是我发现让它发挥作用的唯一方法