可以取消Google云端硬盘上传?

时间:2012-11-29 21:17:15

标签: java android android-asynctask google-drive-api google-api-java-client

我已经使用官方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();

肯定有办法取消上传?

4 个答案:

答案 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对象存储在任意位置(使用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);

到目前为止,这个解决方案还没有产生任何令人讨厌的副作用,不像停止一个线程(不推荐使用),并且与中断不同,保证取消。

答案 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,那么在下次更新上载进度时,我将崩溃,从而导致请求中止。

同样,非常难看,但这是我发现让它发挥作用的唯一方法