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

Я написал приложение, использующее официальный API для загрузки на Google диск, это отлично работает. Однако я никак не могу отменить загрузку. Я запускаю его в ASyncTask, пока я попытался сделать объект диска, путь к файлу, токен и несколько других переменных none. Я также попытался сделать недействительным токен, но, похоже, это только удаляет его из кеша и фактически не делает его недействительным на стороне сервера. Я вызвал отмену на ASyncTask, однако, если он отменяется после запуска загрузки, похоже, нет способа остановить его.

Моя проблема в том, что если пользователь начинает загружать 100-мегабайтный файл, нет возможности отменить его, а затем включить и отключить подключение к Интернету, что нецелесообразно. Это мой код загрузки:

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

Наверняка есть способ отменить загрузку?

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

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

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

Intereting Posts
Расширение AdapterView Клавиатура дисплея эмулятора Android для Visual Studio Com.android.dx.util.DexException: несколько файлов dex определяют Android: WebView повышает скорость загрузки локальных файлов html Двоичная строка XML-файла # 17: ошибка раздувания класса <unknown>, вызванная UnsupportedOperationException: невозможно преобразовать в измерение: type = 0x2 Как создать сетку сетки Recycler с горизонтальной прокруткой Как получить драйвер USB для Samsung Galaxy SIII с номером модели GT-I9300 Ошибка: у YouTubeService просочился IntentReceiver … Вам не хватает вызова unregisterReceiver ()? Как обновить элемент пейджера View TITLE динамически Пользовательский макет пользовательского интерфейса Android ProgressBar Разница между макетом и макетом-400dp-land Изменить цвет фона и цвет текста в строке списка списка в андроиде Android: просмотр файла SharedPreferences? Лучший способ доступа к данным родительской активности Как сохранить приложение на задней кнопке нажмите