MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<String, Object>();
FileSystemResource fileSystemResource = new FileSystemResource(file.getAbsoluteFile()) {
@Override
public String getFilename() {
String filename = fFilename;
if (fContentType.toLowerCase().equals("image/jpeg")) {
if (!filename.toLowerCase().endsWith(".jpeg")) {
filename += ".jpeg";
}
}
return filename;
}
};
MediaType mediaType = MediaType.valueOf(contentType);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(mediaType);
HttpEntity httpEntity = new HttpEntity(fileSystemResource, headers);
multiValueMap.add("file", httpEntity);
additionalHeaders.put("Accept", "");
mailboxServiceHttpAuthStore.setHeaders(additionalHeaders);
// postAttachment is generated by androidannoations, outOfMemory Exception starts here
jsonAttachmentCreated = mailboxServiceRestClient.postAttachment(url, multiValueMap);
转移较大的pdf文件(如~15-20Mb)时会导致OutOfMemory异常
E / dalvikvm-heap:33546614字节分配的内存不足。
有什么可以防止这种情况的?或者缓冲pdf文件?
答案 0 :(得分:0)
我没有对其进行测试,但我认为您可以按照Louis's solution的建议使用ResponseExtractor
解决此问题。
要这样做,你必须像这样调用restTemplate:
File file = (File) restTemplate.execute(rootUrl.concat("/mywebservice"), HttpMethod.GET, requestCallabck, responseExtractor, uriVariables);
使用以下代码实现响应提取器:
public class FileResponseExtractor implements ResponseExtractor<File> {
...
public void setListener(ReceivingListener listener) {
this.listener = listener;
}
@Override
public File extractData(ClientHttpResponse response) throws IOException {
InputStream is = response.getBody();
long contentLength = response.getHeaders().getContentLength();
long availableSpace = AvailableSpaceHandler.getExternalAvailableSpaceInMB();
long availableBytes = AvailableSpaceHandler.getExternalAvailableSpaceInBytes();
Log.d(TAG, "available space: " + availableSpace + " MB");
long spareSize = 1024 * 1024 * 100;
if(availableBytes < contentLength + spareSize) {
throw new NotEnoughWritableMemoryException(availableSpace);
}
File f = new File(temporaryFileName);
if (f.exists())
f.delete();
f.createNewFile();
OutputStream o = new FileOutputStream(f);
listener.onStart(contentLength, null);
boolean cancel = false;
try {
byte buf[] = new byte[bufferSize];
int len;
long sum = 0;
while ((len = is.read(buf)) > 0) {
o.write(buf, 0, len);
sum += len;
listener.onReceiving(sum, len, null);
cancel = !listener.onContinue();
if(cancel) {
Log.d(TAG, "Cancelled!!!");
throw new CancellationException();
}
}
} finally {
o.close();
is.close();
listener.onFinish(null);
if(cancel) {
f.delete();
}
}
return f;
}
}
但是,AndroidAnnotations使用restTemplate.exchange(...)
方法生成RestClient代码。因此,您必须添加&#34;魔法&#34; RestTemplate getRestTemplate()
带注释的界面中的方法@Rest
,以便检索RestTemplate
的实例并调用之前描述的正确方法。
希望它有所帮助。