¿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:
- Polygon Detección táctil Google Map API V2
- Android no puede extender el servicio de mensajería de Firebase
- ScheduledExecuterService.scheduleAtFixedRate crea varios grupos de hilos - Android
- Compruebe la conexión de red y de Internet - Android
- ACTUALIZADO: Android: java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo
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?
- LibGDX Actriz
- Cambiar dinámicamente el límite de una referencia de consulta de Firebase en Android
- Componentes de arquitectura de Android subprocesos de red
- Creación de una función personalizada en sqlite3 en android
- ¿Es posible leer datos de Firebase sin adjuntar ningún oyente?
- Deshabilitar vínculos de WebView funciona en el emulador pero no en el dispositivo
- Cómo utilizar dos fragmentos en Android DrawerLayout
- Control de un motor con un dispositivo Android
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
- ¿Cómo puedo encontrar la ventana virtual / ancho de pantalla con Javascript?
- No se puede reproducir el archivo .mov en VideoView