Java 取消谷歌硬盘上传可能吗?

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的文件,除了打开和关闭他们的互联网连接之外,他们没有办法取消它,这是

我已经写了一个应用程序使用官方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);
    }
});