Java 取消谷歌硬盘上传可能吗?
我已经写了一个应用程序使用官方API上传到谷歌驱动器,这是完美的作品。但是我找不到任何方法来取消上传。我在ASyncTask中运行它,到目前为止,我已经尝试将驱动器对象、文件路径、令牌和其他一些变量设置为无。我也尝试过使令牌无效,但这似乎只是将其从缓存中删除,实际上并不会使其在服务器端无效。我已经在ASyncTask上调用了cancel,但是如果在上传开始后取消它,则似乎无法停止它 我的问题是,如果一个用户开始上传一个100mb的文件,除了打开和关闭他们的互联网连接之外,他们没有办法取消它,这是不切实际的。这是我的上传代码:Java 取消谷歌硬盘上传可能吗?,java,android,android-asynctask,google-drive-api,google-api-java-client,Java,Android,Android Asynctask,Google Drive Api,Google Api Java Client,我已经写了一个应用程序使用官方API上传到谷歌驱动器,这是完美的作品。但是我找不到任何方法来取消上传。我在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();
肯定有办法取消上传吗?好问题!我提交了一个功能请求,要求能够取消媒体上传请求: 然而,基于该库的当前设计,这可能是一个难以实现的特性
另一个要考虑的选项是不要使用AsYcTebug,而是自己实现多线程并中止运行的线程。这并不令人愉快,但可能是您现在唯一的选择。
在我的评论中,我已经说过将请求放入线程和调用中断是不起作用的。所以我在寻找另一种方法 我终于找到了一个,一个丑陋的:关闭上传文件的输入流 我初始化为:mediaContent = new InputStreamContent(NOTE_MIME_TYPE,new BufferedInputStream(new FileInputStream(fileContent)));
mediaContent.setLength(fileContent.length());
在stop listener中,我有:
IOUtils.closeQuietly(mediaContent.getInputStream());
当然,它应该可以做得更好
关于我也一直在寻找答案。以下是我能想到的最好的答案 将
Future
对象存储在您想要的任何位置(使用object
或Void
):
与停止线程(已弃用)不同,该解决方案到目前为止还没有产生任何令人讨厌的副作用,并保证取消,而不是中断。我找到了一种令人讨厌的方法。 我正在开发一款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,则在下一次更新上载进度时,我将崩溃,导致请求中止
同样,非常难看,但这是我找到的唯一让它工作的方法我尝试调用线程。中断()方法,但上载仍将继续。你自己实现多线程是什么意思?你能描述一下吗?应用多线程的步骤是什么?你在Android上使用过吗?IOUtils的绝对名称是什么?我只能导入com.google.api.client.util.IOUtils,但是这个类没有这个方法。mediaContent.getInputStream().close也不起作用。它是Appache IO库的一部分。为什么这个解决方案很难看?因为要停止上传,基本上是让它崩溃。库正在上载,然后关闭InputStream,这可能会在库内部释放异常,然后停止。一个很好地要求停止上传的方法会更好!丑陋的,但最好的方法,目前可用。谢谢这是“实际上”停止文件上载的唯一解决方案。在Android上测试。即使在CancellationException之后,上传仍将继续。只需在上传功能上应用一个线程,并取消该线程以停止文件上传。您可能会看到Ahmed的代码
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);
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);
}
});