9

Napisałem aplikację, używając oficjalnego interfejsu API do przesłania na Dysk Google, działa to idealnie. Jednak nie mogę znaleźć ani anulować przesyłania. Używam go w ASyncTask, do tej pory próbowałem uczynić obiekt napędu, ścieżkę pliku, token i kilka innych zmiennych nie ma. Próbowałem również unieważnić token, jednak wygląda na to, że usuwa go tylko z pamięci podręcznej i nie powoduje jego unieważnienia. Zadzwoniłem anulować na ASyncTask jednak jeśli zostanie anulowane po rozpoczęciu przesyłania wydaje się, że nie ma sposobu, aby to zatrzymać.Czy można anulować przesyłanie z Dysku Google?

Mój problem polega na tym, że jeśli użytkownik zaczyna przesyłać plik o rozmiarze 100 MB, nie ma możliwości anulowania go, a następnie włączania i wyłączania połączenia internetowego, co nie jest praktyczne. To jest mój kod do przesłania:

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

Z pewnością istnieje sposób na anulowanie przesyłania?

Odpowiedz

7

Świetne pytanie! I złożył wniosek fabularny pod kątem zdolności do anulowania żądania przesyłania mediów:

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

Jednak ta cecha może trudny do wdrażają na podstawie obecnego kształtu tej biblioteki.

Inną opcją do rozważenia jest nie używanie AsyncTask, a zamiast tego samodzielne wdrażanie wielowątkowości i przerwanie uruchomionego wątku. Nie jest to przyjemne, ale może być twoją jedyną opcją na zrobienie tego teraz.

+2

Próbowałem zadzwonić wątek. Metoda przerwania(), ale mimo to przesyłanie jest kontynuowane. Co masz na myśli mówiąc, że sam wykonujesz wiele wątków? – pommedeterresautee

2

W komentarzu powiedziałem, że wstawianie żądania w wątku i przerwanie połączenia nie działa. Więc szukałem innego sposobu na zrobienie tego.

W końcu znalazłem jeden, brzydki: Zamknij InputStream przesłanego pliku!

zainicjować z:

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

I słuchacza zatrzymania mam:

IOUtils.closeQuietly(mediaContent.getInputStream()); 

Na pewno powinno być możliwe, aby to zrobić w lepszy sposób!

Pozdrawiam

+0

Użyłeś tego z Androidem? Jaka jest absolutna nazwa IOUtils? Mogę zaimportować tylko com.google.api.client.util.IOUtils, ale ta klasa nie ma tej metody. Funkcja mediaContent.getInputStream(). close również nie działa. – David

+0

jest to część biblioteki IO aplikacji Appache. – pommedeterresautee

+0

I dlaczego to rozwiązanie jest brzydkie? – David

0

Szukałem również odpowiedzi przez długi czas. Oto najlepsze, co mogę wymyślić.

Store przedmiotem Future gdziekolwiek chcesz (wykorzystanie Object lub Void):

Future<Object> future; 

nazywają ten kod (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) 
{} 

Aby anulować, zadzwoń:

future.cancel(true); 

To rozwiązanie nie spowodowało jak dotąd żadnych nieprzyjemnych skutków ubocznych, jak zatrzymanie wątku (przestarzałe) i gwarantuje anulowanie, w przeciwieństwie do przerywania.

+0

Przesyłanie trwa mimo to nawet po złapaniu wyjątku CancellationException – cdkn7

0

Znalazłem paskudny sposób, aby to zrobić. Zajmuję się tworzeniem aplikacji na Androida, ale zakładam, że podobna logika może odnosić się do innych platform

Mam zestaw do progressListener na życzenie Dodano:

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

Jak widać, Użyłem element boolowski, który jest ustawiony z zewnątrz, gdy trzeba przerwać wysyłanie. Jeśli ta wartość logiczna jest ustawiona na wartość true, podczas następnej aktualizacji postępu przesyłania nastąpi awaria, co spowoduje przerwanie żądania.

Ponownie, bardzo brzydki, ale to był jedyny sposób znalazłem, aby to działało

Powiązane problemy