Отменить загрузку Google Диска возможно?

Я написал приложение, используя официальный API для загрузки на Google Диск, это отлично работает. Однако я все равно не могу найти, чтобы отменить загрузку. Я запускаю его в ASyncTask, до сих пор я пытался сделать объект диска, путь к файлу, токен и несколько других переменных нет. Я также попытался аннулировать токен, однако кажется, что это только удаляет его из кэша и фактически не аннулирует его на стороне сервера. Я вызвал cancel на 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 ответов


большой вопрос! Я подал запрос на функцию для возможности отмены запроса загрузки мультимедиа:

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

однако это может быть трудная функция для реализации на основе текущего дизайна этой библиотеки.

другой вариант для рассмотрения-не использовать AsyncTask и вместо этого реализовать многопоточность самостоятельно и прервать запущенный поток. Не приятно, но может быть твой единственный вариант сделать это сейчас.


в комментарии я сказал, что размещение запроса в потоке и прерывание вызова не работает. Поэтому я искал другой способ сделать это.

Я, наконец, нашел один, уродливый: закройте InputStream загруженного файла!

Я инициализирую с:

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

и в стоп-слушателе у меня:

IOUtils.closeQuietly(mediaContent.getInputStream());

наверняка это должно быть возможно сделать это лучше!

в отношении


Я тоже давно ищу ответ. Вот лучшее, что я смог придумать.

сохранить 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);

это решение до сих пор не дало никаких неприятных побочных эффектов, в отличие от остановки потока (устаревшего), и гарантирует отмену, в отличие от прерывания.


Я нашел неприятный способ сделать это. Я разрабатываю приложение для 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, то при следующем обновлении хода загрузки произойдет сбой, что приведет к прерыванию запроса.

опять же, очень некрасиво, но это был единственный способ заставить его работать