9

Ich habe eine App mit der offiziellen API geschrieben, um auf Google Drive hochzuladen, das funktioniert perfekt. Allerdings kann ich sowieso keinen Upload abbrechen. Ich führe es in einer ASyncTask, bis jetzt habe ich versucht, das Laufwerksobjekt, den Dateipfad, das Token und einige andere Variablen zu machen. Ich habe auch versucht, das Token ungültig zu machen, aber es scheint, dass es nur es aus dem Cache entfernt und nicht tatsächlich Server-Seite ungültig macht. Ich habe Abbrechen auf der ASyncTask aufgerufen, aber wenn es abgebrochen wird, sobald der Upload gestartet wurde, scheint es keine Möglichkeit zu geben, es zu stoppen.Google Drive-Upload abbrechen?

Mein Problem ist, wenn ein Benutzer beginnt, eine 100mb-Datei hochzuladen, gibt es keine Möglichkeit für sie, es abzubrechen andere dann ihre Internetverbindung ein- und auszuschalten, was nicht praktikabel ist. Das ist mein Upload-Code:

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

Sicher gibt es eine Möglichkeit, einen Upload abzubrechen?

Antwort

7

Große Frage! Ich legte für die Fähigkeit, eine Feature-Anfrage ein Medium Upload-Anforderung abzubrechen:

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

Dies ist jedoch eine schwierige Funktion kann basierend auf dem aktuellen Design dieser Bibliothek zu implementieren.

Eine andere Option, die in Betracht gezogen werden sollte, besteht darin, AsyncTask nicht zu verwenden und stattdessen das Multithreading selbst zu implementieren und den laufenden Thread abzubrechen. Nicht angenehm, aber vielleicht die einzige Möglichkeit, dies jetzt zu tun.

+2

Ich habe versucht, Thread aufzurufen. Interrupt() Methode, aber der Upload wird trotzdem fortgesetzt. Was meinst du damit, das Multi-Thread selbst zu implementieren? – pommedeterresautee

2

In einem Kommentar habe ich gesagt, dass das Anordnen der Anfrage in einem Thread und Aufruf Interrupt nicht funktioniert. Also habe ich nach einer anderen Möglichkeit gesucht.

Ich habe endlich eine, eine hässliche gefunden: Schließen Sie den InputStream der hochgeladenen Datei!

ich initialisieren mit:

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

Und in einem Stop-Hörer ich habe:

IOUtils.closeQuietly(mediaContent.getInputStream()); 

Natürlich sollte es möglich sein, sie in einer besseren Art und Weise zu tun!

Grüße

+0

Haben Sie das mit Android verwendet? Wie lautet der absolute Name von IOUtils? Ich kann nur com.google.api.client.util.IOUtils importieren, aber diese Klasse hat diese Methode nicht. mediaContent.getInputStream(). Schließen funktioniert auch nicht. – David

+0

ist Teil von Appache IO lib. – pommedeterresautee

+0

Und warum ist diese Lösung eine hässliche? – David

0

Ich habe auch für eine lange Zeit für eine Antwort gesucht. Das Folgende ist das Beste, was ich mir vorstellen kann.

Shop das Future Objekt, wohin Sie wollen (Verwendung Object oder Void):

Future<Object> future; 

Aufruf dieser Code (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) 
{} 

abzubrechen, rufen:

future.cancel(true); 

Diese Lösung hat bisher keine unangenehmen Nebenwirkungen, un wie das Stoppen eines Threads (veraltet) und garantiert einen Abbruch, im Gegensatz zum Unterbrechen.

+0

Das Hochladen wird trotzdem fortgesetzt, auch nachdem die CancellationException abgefangen wurde – cdkn7

0

Ich habe einen fiesen Weg gefunden, es zu tun. Ich entwickle eine Android-App, aber ich nehme an ähnliche Logik auf andere Plattformen anwenden können

ich einen progressListener auf die Upload-Anforderung festgelegt haben:

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

Wie Sie sehen können, habe ich verwendet, um eine Boolesches Element, das von außerhalb festgelegt wird, wenn ich den Upload abbrechen muss. Wenn dieser boolesche Wert auf "true" gesetzt ist, stürzt ich bei der nächsten Aktualisierung des Upload-Fortschritts ab, was zum Abbruch der Anfrage führt.

Wieder, sehr hässlich, aber das war der einzige Weg, wie ich es funktionierte