9

Tôi đã viết một ứng dụng bằng API chính thức để tải lên Google drive, điều này hoạt động hoàn hảo. Tuy nhiên, tôi không thể tìm thấy cách nào để hủy tải lên. Tôi đang chạy nó trong một ASyncTask, cho đến nay tôi đã cố gắng làm cho đối tượng ổ đĩa, đường dẫn tệp, mã thông báo và một vài biến khác không có. Tôi cũng đã cố gắng để làm mất hiệu lực các mã thông báo tuy nhiên có vẻ như điều này chỉ loại bỏ nó khỏi bộ nhớ cache và không thực sự vô hiệu hóa phía máy chủ. Tôi đã gọi là hủy bỏ trên ASyncTask tuy nhiên nếu nó bị hủy bỏ một khi tải lên đã bắt đầu có vẻ như không có cách nào để ngăn chặn nó.Hủy tải lên Google Drive có thể?

Vấn đề của tôi là nếu người dùng bắt đầu tải lên tệp 100MB không có cách nào để họ hủy nó khác, sau đó bật và tắt kết nối internet của họ mà không thực tế. Đây là mã tải lên của tôi:

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

Chắc chắn có cách nào để hủy tải lên?

Trả lời

7

Câu hỏi hay! Tôi đã đệ đơn yêu cầu tính năng cho khả năng hủy bỏ một yêu cầu phương tiện truyền thông tải lên:

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

Tuy nhiên, điều này có một tính năng khó thực hiện dựa trên thiết kế hiện tại của thư viện đó.

Một tùy chọn khác để xem xét là không sử dụng AsyncTask và thay vào đó thực hiện tự đa luồng và hủy bỏ Chủ đề đang chạy. Không dễ chịu, nhưng có thể là lựa chọn duy nhất của bạn để thực hiện việc này ngay bây giờ.

+2

Tôi đã cố gắng gọi chuỗi. Phương thức ngắt() nhưng quá trình tải lên vẫn tiếp tục. Bạn có ý nghĩa gì khi tự mình triển khai chủ đề đa? – pommedeterresautee

2

Trong nhận xét tôi đã nói rằng việc đưa yêu cầu vào một chuỗi và ngắt cuộc gọi không hoạt động. Vì vậy, tôi đã tìm kiếm một cách khác để làm điều đó.

Cuối cùng tôi đã tìm thấy một hình ảnh xấu xí: Đóng InputStream của tệp được tải lên!

tôi khởi tạo với:

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

Và trong một listener dừng tôi có:

IOUtils.closeQuietly(mediaContent.getInputStream()); 

Chắc chắn chúng ta có thể làm điều đó một cách tốt nhất!

Kính trọng

+0

Bạn đã sử dụng ứng dụng này với Android chưa? tên tuyệt đối của IOUtils là gì? Tôi chỉ có thể nhập com.google.api.client.util.IOUtils nhưng lớp này không có phương thức này. mediaContent.getInputStream(). đóng cũng không hoạt động. – David

+0

nó là một phần của Appache IO lib. – pommedeterresautee

+0

Và tại sao giải pháp này là một giải pháp xấu xí? – David

0

Tôi cũng đang tìm kiếm câu trả lời trong một thời gian dài. Sau đây là điều tốt nhất tôi có thể nghĩ ra.

Store đối tượng Future bất cứ nơi nào bạn muốn (sử dụng Object hoặc Void):

Future<Object> future; 

Gọi mã này (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) 
{} 

Để hủy, hãy gọi:

future.cancel(true); 

Giải pháp này đã không tạo ra bất kỳ tác dụng phụ khó chịu nào cho đến nay, un như dừng một chuỗi (không được chấp nhận) và đảm bảo hủy, không giống như gián đoạn.

+0

Quá trình tải lên vẫn tiếp tục ngay cả sau khi CancellationException bị bắt – cdkn7

0

Tôi đã tìm thấy một cách khó chịu để thực hiện điều đó. Tôi đang phát triển một ứng dụng android, nhưng tôi giả định lý tương tự có thể áp dụng đối với các nền tảng khác

tôi đã thiết lập một progressListener để yêu cầu tải lên:

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

Như bạn thấy đấy, tôi đã sử dụng một thành viên boolean được đặt từ bên ngoài khi tôi cần phải hủy tải lên. Nếu boolean này được đặt thành true, thì trên bản cập nhật tiếp theo của quá trình tải lên, tôi sẽ gặp sự cố, dẫn đến phá thai yêu cầu.

Một lần nữa, rất xấu, nhưng đó là cách duy nhất tôi tìm thấy để làm cho nó hoạt động