gpt4 book ai didi

android - Android 中 String、StringBuffer 和 StringBuilder 的内存不足异常

转载 作者:行者123 更新时间:2023-11-30 04:31:55 36 4
gpt4 key购买 nike

我在将 1.8MB 图像转换为字节然后加密,最后转换为字符串时遇到内存不足异常(日志中打印的长度为 1652328)。然后,我将此字符串附加到某种 XML 格式以进行发布,这才是真正的问题所在。使用 StringBufferStringBuilder 将一些标签附加到此 pictureString 或添加到字符串时发生 Out of Memory 异常。我该如何解决这个问题?

对于小图片,此问题不会重现。

下面的代码将路径 path 中的图片转换为 String

fis = new FileInputStream(path);
buffer = new byte[fis.available()];
try {
fis.read(buffer, 0, buffer.length);
String byteString =
com.mobile.android.components.Base64.encodeBytes(buffer);
return byteString;
} catch (IOException ex) {

}

上面的 byteString 被附加到 xml post 如下。

StringBuilder pictureName = new StringBuilder();
pictureName.append(byteString ); //here array out of bound at StringBuilder.extendBuffer
..........
appending continues

已更新

在上面的附加中,编码的byteStream使用密码AES加密,然后附加到StringBuilder

最佳答案

将位图转换为字节数组后,立即调用 bitmap.recycle();。这将释放与此位图关联的 native 对象,并清除对像素数据的引用。

更新

很明显,从文件流中读取的内存块太大,无法处理。避免一次读取整个文件。一 block 一 block 地做。在不使用中间字符串对象的情况下将字符串附加到 xml。

更新2

你可以做这样的事情来避免在将它发送到服务器时加载整个 xml 文件。

// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);

// Enable POST method
connection.setRequestMethod("POST");

outputStream = new DataOutputStream( connection.getOutputStream() );
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);

while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}

然后写入边界字符,刷新并关闭流。

关于android - Android 中 String、StringBuffer 和 StringBuilder 的内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7557373/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com