如何使用google-api-java-client在Android上下载大文件?
问题描述:
最近,我尝试使用google-api-java-client库来访问Google文档。我可以使用此库来获取列表,创建新文档并成功更新。但是,当我想从Google文档下载大文件(> 10mb)时,会导致OutOfMemoryError。如何使用google-api-java-client在Android上下载大文件?
03-30 17:57:10.650: E/AndroidRuntime(11022): java.lang.OutOfMemoryError
03-30 17:57:10.650: E/AndroidRuntime(11022): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
03-30 17:57:10.650: E/AndroidRuntime(11022): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
03-30 17:57:10.650: E/AndroidRuntime(11022): at com.google.api.client.http.AbstractInputStreamContent.copy(AbstractInputStreamContent.java:213)
03-30 17:57:10.650: E/AndroidRuntime(11022): at com.google.api.client.http.AbstractInputStreamContent.copy(AbstractInputStreamContent.java:179)
03-30 17:57:10.650: E/AndroidRuntime(11022): at com.google.api.client.http.HttpResponse.getContent(HttpResponse.java:384)
这是我的代码:
try {
...
HttpRequest request = getRequestFactory().buildGetRequest(link);
HttpResponse response = request.execute();
InputStream is = response.getContent();
...
} catch (IOException e) {
e.printStackTrace();
}
响应代码是200,它可以在小文件成功运行。 有没有什么方法使用google-api-java-client下载大文件?
答
感谢您报告问题!对我来说看起来像一个bug。在这里提起它:
http://code.google.com/p/google-http-java-client/issues/detail?id=82
作为一个变通办法,请了这个请求禁用日志记录如下:
request.setContentLoggingLimit(0);
我认为,你在你的代码,那里的三个点现在,是相关的部分。如果文件太大,则必须将其传输到文件系统,因为您无法将其保存在内存中。 – koma 2012-03-30 12:12:59
我发现问题是api函数response.getContent(),它使用ByteArrayOutputStream保存文件数据。所以当文件太大时,会导致OutOfMemoryError。 – bukiya 2012-04-03 01:43:59