我有一个问题..
异常java.lang.OutOfMemoryError:
在以下一行..
byte[] byteArray = new byte[bufferSize];
原因应该是什么以及如何防止它。
CODE
private byte[] createPreviewBuffer(Size previewSize) {
int bitsPerPixel = ImageFormat.getBitsPerPixel(ImageFormat.NV21);
long sizeInBits = previewSize.getHeight() * previewSize.getWidth() * bitsPerPixel;
int bufferSize = (int) Math.ceil(sizeInBits / 8.0d) + 1;
//
// NOTICE: This code only works when using play services v. 8.1 or higher.
//
// Creating the byte array this way and wrapping it, as opposed to using .allocate(),
// should guarantee that there will be an array to work with.
byte[] byteArray = new byte[bufferSize];
ByteBuffer buffer = ByteBuffer.wrap(byteArray);
if (!buffer.hasArray() || (buffer.array() != byteArray)) {
// I don't think that this will ever happen. But if it does, then we wouldn't be
// passing the preview content to the underlying detector later.
throw new IllegalStateException("Failed to create valid buffer for camera source.");
}
mBytesToByteBuffer.put(byteArray, buffer);
return byteArray;
}
CRASH DEVICE INFO
答案 0 :(得分:0)
为什么用大数字计算?
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn">
<shape android:shape="rectangle">
<corners android:radius="30dp"/>
</shape>
</item>
可能是
int bitsPerPixel = ImageFormat.getBitsPerPixel(ImageFormat.NV21);
long sizeInBits = previewSize.getHeight() * previewSize.getWidth() * bitsPerPixel;
int bufferSize = (int) Math.ceil(sizeInBits / 8.0d) + 1;
您不需要十进制转换并保持在int类型范围内。
你在哪一行获得了OOM-Error?
我不知道你是否可以要求设备提供空闲内存,并且如果可用的话小于计算的缓冲区大小,则会发出消息。
答案 1 :(得分:0)
那段代码来自Google的Android视觉库,我经常看到它复制到人们自己的项目中。
这是一个特别占用内存的代码,因此如果您的设备内存不足,则很有可能会失败。我建议在您的应用上运行探查器,以查看泄漏的位置。
对我来说,泄漏发生在CameraSource
周围,其中包含未正确处理的上述代码。确保您调用cameraSource!!.release()
进行活动破坏,随着时间的推移会破坏其他活动,每次您击中该活动都会慢慢消耗掉更多的内存:)