2

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を読み取ろうとし、チャンクのキューを使用してキロバイトのチャンクが利用可能になったときに に出力する必要があると思います。読み取りコードと書き込みコードを結び付けるのは面倒に思えますし、確実にお互いの速度が低下します。InputStreamOutputStream

第二に、バッファ サイズを変更すると、データ レートにまったく影響がありますか? 1 キロバイトは小さいように見えますが、モバイル接続ではそれほど小さくはないかもしれません。次に、チャンクが大きいほど、読み取り/書き込みループの各セクションからの待機が大きくなります。異なるサイズのバッファを使用することは検討する価値がありますか?

4

1 に答える 1

1

あなたがしたことよりも洗練された方法はないと思います。おそらく、より大きなチャンク (数百 KB など) でいくつかの実験を行い、時間を測定することができます。速かったと思います。

チャンク サイズについては、drive/java-api-client-library のドキュメントも確認してください。何らかの説明があったと思いますが、100% 確信があるわけではありません。

于 2013-02-28T10:25:48.670 に答える