Google ドライブから画像をダウンロードする必要があるアプリを作成しています。現在、次のコードを使用してこれを行っています。
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
は、使用している資格情報で Google ドライブを取得する単なるクラスです。とにかく、私が見つけることができるほとんどの例では、この基本構造を使用して からファイルをダウンロードしてInputStream
に配置していOutputStream
ますが、ダウンロード速度はかなり遅いです。
まず、一度に1 キロバイトInputStream
まで同期的にバッファリングするよりも、より洗練された方法を使用して高速化できますか? 別のスレッドでOutputStream
を読み取ろうとし、チャンクのキューを使用してキロバイトのチャンクが利用可能になったときに に出力する必要があると思います。読み取りコードと書き込みコードを結び付けるのは面倒に思えますし、確実にお互いの速度が低下します。InputStream
OutputStream
第二に、バッファ サイズを変更すると、データ レートにまったく影響がありますか? 1 キロバイトは小さいように見えますが、モバイル接続ではそれほど小さくはないかもしれません。次に、チャンクが大きいほど、読み取り/書き込みループの各セクションからの待機が大きくなります。異なるサイズのバッファを使用することは検討する価値がありますか?