在Android中下载Google云端硬盘图片的最有效方法是什么?

时间:2013-02-27 12:09:08

标签: android google-drive-api inputstream outputstream google-api-java-client

我正在编写一个应用程序,要求从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,但下载速度相当慢。

首先,我可以使用比一次同步缓冲InputStreamOutputStream千字节更复杂的方法来加快速度吗?让我感到震惊的是,我应该尝试在不同的线程上读取InputStream,并输出到OutputStream,因为千字节块可以使用块队列来获取。将读取代码和写入代码绑在一起看起来很笨拙,它们肯定会相互减慢。

其次,改变缓冲区大小会影响数据速率吗?一千字节似乎很小,但在移动连接上它可能不是那么小。然后,块越大,读/写循环的每个部分的等待时间越大。使用不同大小的缓冲区值得考虑吗?

1 个答案:

答案 0 :(得分:1)

我认为没有比你做的更复杂的方法。 你可以用更大的块(例如几百KB)进行一些实验并测量它们。我认为它更快。

另请查看有关块大小的drive / java-api-client-library文档。我认为有一些解释,但我不是百分之百确定。