我正在开发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)或者是否有策略来读取文件而不将其存储在内存中?