안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
지금 파일다운로드 관련 작업을 하고 있는데요
10MB 넘어가는 파일들을 다운로드 할때 Out of memory on a 16777232-byte allocation 문제가 발생합니다.
게시판 검색해서 아래 내용 확인하고 처리했지만 그래도 발생을 합니다.
참고 : http://www.androidpub.com/258470
처리 방식은 아래와 같습니다.
InputStream is = mConn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
int current = 0;
ByteArrayBuffer baf = new ByteArrayBuffer(128);
while ((current = bis.read()) != -1) {
....
}
혹 위 소스상의 문제나 비슷한 문제를 해결하신 방법이나 참고할 만한 소스가 있는지 문의 드립니다.
수고하세요.
지금 파일다운로드 관련 작업을 하고 있는데요
10MB 넘어가는 파일들을 다운로드 할때 Out of memory on a 16777232-byte allocation 문제가 발생합니다.
게시판 검색해서 아래 내용 확인하고 처리했지만 그래도 발생을 합니다.
참고 : http://www.androidpub.com/258470
처리 방식은 아래와 같습니다.
InputStream is = mConn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
int current = 0;
ByteArrayBuffer baf = new ByteArrayBuffer(128);
while ((current = bis.read()) != -1) {
....
}
혹 위 소스상의 문제나 비슷한 문제를 해결하신 방법이나 참고할 만한 소스가 있는지 문의 드립니다.
수고하세요.
2010.06.07 11:25:10
아.. 답변을 잘못했네요. while 안쪽의 내용을 올려주셔야 정확하게 알 수 있을 것 같네요.
보기에는 ByteArrayBuffer 에다가 current 를 전부 넣으시는거 같아서 드린 답변입니다.
그리고 보통 HttpURLConnection 등을 사용하여 InputStream 을 받을 때
.read() 는 효율이 떨어집니다.
byte [] buffer = new byte[8*1024];
int length = 0;
while ((length = bis.read(buffer)) >= 0) {
//내부 메모리에 복사 또는 FileOutputStream 에 write
}
로 하시는게 좋습니다.
2010.06.07 12:56:46
네, while 안에 아래와 같이 처리 후
while ((current = bis.read()) != -1) {
baf.append((byte)current);
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(baf.toByteArray());
fos.close();
write 처리하는데요 말씀하신데로 buffer만큼 처리하니 안되네요.
좀더 해봐야 겠네요. 감사합니다.
while ((current = bis.read()) != -1) {
baf.append((byte)current);
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(baf.toByteArray());
fos.close();
write 처리하는데요 말씀하신데로 buffer만큼 처리하니 안되네요.
좀더 해봐야 겠네요. 감사합니다.