11

我已经使用官方 API 编写了一个应用程序来上传到 Google 驱动器,这非常有效。但是我无论如何都找不到取消上传。我在 ASyncTask 中运行它,到目前为止,我已经尝试使驱动器对象、文件路径、令牌和其他一些变量都没有。我也尝试过使令牌无效,但似乎这只是将其从缓存中删除,实际上并没有使其服务器端无效。我已经在 ASyncTask 上调用了取消,但是如果在上传开始后取消它,似乎没有办法停止它。

我的问题是,如果用户开始上传一个 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();

肯定有办法取消上传吗?

4

4 回答 4

8

好问题!我提交了取消媒体上传请求的功能请求:

https://code.google.com/p/google-api-java-client/issues/detail?id=671

但是,根据该库的当前设计,这可能是一个难以实现的功能。

另一个要考虑的选项是不使用 AsyncTask,而是自己实现多线程并中止正在运行的线程。不愉快,但可能是您现在这样做的唯一选择。

于 2012-12-03T16:08:45.103 回答
2

在评论中,我说过将请求放入线程并调用中断不起作用。所以我正在寻找另一种方法。

终于找到了,一个丑陋的:关闭上传文件的InputStream!

我初始化:

mediaContent = new InputStreamContent(NOTE_MIME_TYPE,new BufferedInputStream(new FileInputStream(fileContent)));
mediaContent.setLength(fileContent.length());

在停止侦听器中,我有:

IOUtils.closeQuietly(mediaContent.getInputStream());

当然,应该有可能以更好的方式做到这一点!

问候

于 2012-12-24T11:29:20.343 回答
0

我也找了很久的答案。以下是我能想到的最好的。

Future对象存储在您想要的任何位置(使用ObjectVoid):

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);

到目前为止,该解决方案没有产生任何令人讨厌的副作用,这与停止线程(已弃用)不同,并且与中断不同,它保证了取消。

于 2014-06-22T16:07:02.520 回答
-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,那么在下一次更新上传进度时我会崩溃,导致请求中止。

再次,非常丑陋,但这是我发现让它工作的唯一方法

于 2016-03-20T15:47:45.173 回答