由于读取大量文件,Android内存不足错误

时间:2015-07-04 20:06:29

标签: java android

我正在开发Android / Java的P2P应用程序。我的android客户端需要从目录中读取文件(片段),然后将它们附加到发送到服务器的消息中。片段大小介于256 KB到1 MB之间。但是我不知道在运行时间之前已经有多少件(这取决于原始文件的大小)。

以下是执行转移的代码,

for (File fl : Util.getFilesInPath(pieceTmpPath)) {

    buf = FileUtils.readFileToByteArray(fl);
    pieceInfo = new Piece(1,fl.getName(), "");
    int retry = 3;
    boolean transferSuccess = false;
    while (retry > 0) {
        try {
            UUID msgID = conn.sendPieceContent(pieceInfo, buf);
            if (conn.receivedACK(msgID)) {
                transferSuccess = true;
                break;
            }
        } catch (Exception e) {
            retry--;
        }
    }

    if (!transferSuccess) {
        allPiecesSent = false;
        break;
    }
    buf = null;
    pieceInfo = null;
}

但是,上面的代码会在我的模拟器中导致java.lang.OutOfMemoryError。我可以尝试使用getMemoryClass()并告知用户该设备不适合传输,但是如果文件数量足够大,这个问题迟早会出现。

我认为问题是由于文件被快速连续读取,导致在GC清理对象之前出现OOM错误。有没有办法释放android中的对象的内存(System.gc()似乎不起作用,并且不推荐afaik)或者是否有策略来读取文件而不将其存储在内存中?

0 个答案:

没有答案