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