我正在編寫一個應用程序,要求從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
,但下載速度很慢。
首先,我可以通過使用更復雜的方法加速它,而不是同時緩衝一個千字節的InputStream
到OutputStream
?它讓我想起我應該嘗試在另一個線程上讀取InputStream
,並輸出到OutputStream
,因爲千字節塊可以使用塊的隊列。將讀取的代碼和寫入的代碼捆綁在一起似乎很笨拙,它們一定會減慢彼此的速度。其次,改變緩衝區大小會不會影響數據速率?千字節似乎很小,但在移動連接上可能並不是那麼小。然後,塊越大,讀/寫循環的每個部分的等待就越大。是否正在使用不同大小的緩衝區值得考慮?
無論如何,我會玩弄它,但感謝您的反饋:) – 2013-02-28 16:40:42