下载文件时内存不足

时间:2012-01-04 16:30:53

标签: android download out-of-memory

HttpResponse responseGet;
        try {
            responseGet = client.execute(get);
            switch (responseGet.getStatusLine().getStatusCode()) {
            case 200:
                File SDCardRoot = Environment.getExternalStorageDirectory();
                File directory = new File(SDCardRoot
                        + "/OfflineDocuments/"
                        + (document.getPath() == null ? ""
                                : (document.getPath() + "/")));
                directory.mkdirs();
                File file = new File(directory, fileName);
                InputStream is = responseGet.getEntity().getContent();
                BufferedInputStream bis = new BufferedInputStream(is);

                ByteArrayBuffer baf = new ByteArrayBuffer(50);
                int current = 0;
                while ((current = bis.read()) != -1) {
                    baf.append((byte) current);
                }

                FileOutputStream fos = new FileOutputStream(file);
                fos.write(baf.toByteArray());
                fos.close();
                break;

            default:
                Log.e("Statuscode", "Unexpected status code: "
                        + responseGet.getStatusLine().getStatusCode());
                break;
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

这适用于小型文档。但是对于大于几MB的文档,此代码与“OutOfMemoryException”崩溃。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您正在将文件整个写入内存,然后将该缓冲文件写入存储。相反,跳过缓冲并在存储进入存储时将其写入存储。

FileOutputStream fos = new FileOutputStream(file);
while ((current = bis.read()) != -1) {
    fos.write(current);
}
fos.close();

注意......不是Android开发人员,所以不知道这是否真的有效,所以将其视为伪代码。

答案 1 :(得分:0)

您只是尝试将整个文件读入内存,而您的JVM没有足够的可用内存。您可能希望在while循环中写入文件,而不是将其附加到缓冲区。