java android android-asynctask google-drive-sdk google-api-java-client

java - Cancelar la carga de Google Drive posible?



android android-asynctask (4)

He escrito una aplicación que usa la API oficial para subirla a la unidad de Google, esto funciona perfectamente. Sin embargo, no puedo encontrar de todos modos para cancelar una carga. Lo estoy ejecutando en ASyncTask, hasta ahora he intentado hacer que el objeto de la unidad, la ruta del archivo, el token y algunas otras variables ninguna. También he intentado invalidar el token, pero parece que esto solo lo elimina del caché y no lo invalida en el servidor. He llamado cancelar en ASyncTask; sin embargo, si se cancela una vez que ha comenzado la carga, parece que no hay forma de detenerlo.

Mi problema es que si un usuario comienza a cargar un archivo de 100 mb, no hay forma de que lo cancele y luego prende y apaga la conexión a Internet, lo que no es práctico. Este es mi código de carga:

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 carga?


Gran pregunta! Presenté una solicitud de función para poder cancelar una solicitud de carga multimedia:

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

Sin embargo, esta puede ser una característica difícil de implementar en función 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 tu única opción para hacer esto ahora.


En un comentario, he dicho que poner la solicitud en un hilo y llamar a interrupción no funciona. Así que estaba buscando otra forma de hacerlo.

Finalmente encontré uno, uno feo: ¡cierra el InputStream del archivo cargado!

Inicializo con:

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

Y en un oyente stop tengo:

IOUtils.closeQuietly(mediaContent.getInputStream());

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

Saludos


He estado buscando una respuesta durante mucho tiempo también. Lo siguiente es lo mejor que se me ocurrió.

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

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


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

Establecí un progressListener para 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 puede ver, he usado un miembro booleano que está configurado desde afuera cuando necesito abortar la carga. Si este valor booleano se establece en verdadero, en la próxima actualización del progreso de la carga se bloqueará, lo que provocará el aborto de la solicitud.

De nuevo, muy feo, pero esa fue la única forma que encontré para que funcione