¿Cancelar la carga de Google Drive posible?

He escrito una aplicación utilizando la API oficial para subir a Google Drive, esto funciona perfectamente. Sin embargo, no puedo encontrar de todos modos para cancelar una subida. Lo estoy funcionando en un ASyncTask, hasta ahora he intentado hacer el objeto de la impulsión, la trayectoria del archivo, el símbolo y algunas otras variables ninguna. También he intentado invalidar el token, sin embargo, parece que esto sólo lo elimina de la caché y en realidad no lo invalida del lado del servidor. He llamado cancelar en el ASyncTask sin embargo, si se cancela una vez que la carga ha comenzado no parece haber forma de detenerlo.

Mi problema es si un usuario comienza a cargar un archivo de 100mb no hay manera de que lo cancele a continuación, a continuación, activar su conexión a Internet dentro y fuera que no es práctico. Este es mi código de subida:

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

Seguramente hay una manera de cancelar una subida?

Gran pregunta Archivé una solicitud de función para la capacidad de cancelar una solicitud de carga de medios:

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

Sin embargo, esto puede ser una característica difícil de implementar sobre la base del diseño actual de esa biblioteca.

Otra opción a considerar es no utilizar AsyncTask y en su lugar implementar el multi-threading usted mismo y abortar el hilo en ejecución. No es agradable, pero puede ser la única opción para hacer esto ahora.

En un comentario he dicho que poner la solicitud en un subproceso y la interrupción de llamada no funciona. Así que estaba buscando otra manera de hacerlo.

Finalmente he encontrado uno, un feo: ¡Cierra el InputStream del archivo subido!

Me inicializo con:

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

Y en un oyente de parada tengo:

 IOUtils.closeQuietly(mediaContent.getInputStream()); 

¡Seguro que debería ser posible hacerlo de una manera mejor!

Saludos

He estado buscando una respuesta por mucho tiempo también. Lo siguiente es lo mejor que podría llegar a.

Guarde el objeto Future cualquier lugar que desee (use Object o Void ):

 Future<Object> future; 

Llame a este código (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) {} 

Para cancelar, llame a:

 future.cancel(true); 

Esta solución no ha producido ningún efecto secundario desagradable hasta ahora, a diferencia de detener un hilo (obsoleto), y garantiza una cancelación, a diferencia de la interrupción.

He encontrado una manera desagradable de hacerlo. Estoy desarrollando una aplicación para Android, pero supongo que una lógica similar puede aplicarse a otras plataformas

He definido un progressListener a la solicitud de carga:

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

Como puedes ver, he usado un miembro booleano que está configurado desde fuera cuando necesito abortar la subida. Si este booleano se establece en true, entonces en la próxima actualización del progreso de carga me bloquearé, resultando en el aborto de la solicitud.

Una vez más, muy feo, pero esa fue la única manera que encontré para que funcione

  • Validación de Camel case para String en android
  • Convertidor de gson retrofit para json anidado con diferentes objetos
  • Añadir al archivo android
  • Android - ¿Puede publicar diferentes aplicaciones con el mismo archivo de almacén de claves en varias cuentas?
  • Clasificación de ListView por nombre del producto con adaptador personalizado?
  • Umbral adaptable rápido para Canny Edge Detector en Android
  • No se puede cerrar ChunkedInputStream rápidamente en Android 4.4 KitKat
  • Archivos bajo la carpeta de compilación se generan y no se deben editar, no se puede volver a generar el proyecto de android
  • Excepción de puntero nulo en .setOnClickListener
  • Establecer permanentemente el título DatePickerDialog
  • ¿Cómo puedo implementar Google Play Licensing para una aplicación de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.