2

我正在編寫一個應用程序,要求從Google雲端硬盤下載圖片。我目前做這個使用下面的代碼:在Android中下載Google Drive圖像的最有效方式是什麼?

protected void downloadFromDrive(Context context) { 
    InputStream input = null; 
    FileOutputStream output = null; 
    try { 
     HttpRequest request = GoogleDriveWorker.get(context) 
     .getDrive() 
     .getRequestFactory() 
     .buildGetRequest(new GenericUrl(getUri())); 
     input = request.execute().getContent(); 
     output = context.openFileOutput(getImageFilename(), Context.MODE_PRIVATE); 
     int bufferSize = 1024; 
     byte[] buffer = new byte[bufferSize]; 
     int len = 0; 
     while ((len = input.read(buffer)) != -1) { 
      output.write(buffer, 0, len); 
     } 
    } catch (UnrecoverableKeyException e) { 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (CertificateException e) { 
     e.printStackTrace(); 
    } catch (KeyStoreException e) { 
     e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if(output!=null) 
       output.close(); 
      if(input!=null) 
       input.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public String getUri() { 
    return mUri; 
} 

GoogleDriveWorker僅僅是一個類,得到了谷歌推動與我們使用的憑據。無論如何,我能找到的大多數示例都使用這個基本結構從InputStream下載文件並將其放到OutputStream,但下載速度很慢。

首先,我可以通過使用更復雜的方法加速它,而不是同時緩衝一個千字節的InputStreamOutputStream?它讓我想起我應該嘗試在另一個線程上讀取InputStream,並輸出到OutputStream,因爲千字節塊可以使用塊的隊列。將讀取的代碼和寫入的代碼捆綁在一起似乎很笨拙,它們一定會減慢彼此的速度。其次,改變緩衝區大小會不會影響數據速率?千字節似乎很小,但在移動連接上可能並不是那麼小。然後,塊越大,讀/寫循環的每個部分的等待就越大。是否正在使用不同大小的緩衝區值得考慮?

回答

1

我不認爲有比你做的更復雜的方法。 你可以用更大的塊(例如幾百KB)做一些實驗並測量它。我認爲它更快。

此外,請檢查有關塊大小的驅動器/ java-api-client-library文檔。我想有關於它的一些解釋,但我不是100%確定的。

+0

無論如何,我會玩弄它,但感謝您的反饋:) – 2013-02-28 16:40:42

相關問題