gpt4 book ai didi

带位图的 Android OOM

转载 作者:太空狗 更新时间:2023-10-29 14:46:15 26 4
gpt4 key购买 nike

所以我在 Crashlytics 中看到我们有很多崩溃是由位图的 OOM 引起的。似乎其中 60% 来自 6.0.1 上的 Galaxy S7 Edge 设备。我们拥有的是一个包含 2 个图像的着陆屏幕,一个背景图像从右向左滚动,然后重新创建以使它们给人以移动到前景图像的印象。

在 Fabric 日志的顶部,它说在扩充类时出错。但是在堆栈的更下方,我发现它似乎是由我们的 ParallaxImageView 引起的。在这里我们这样做:

private void initializeCustomAttrs(Context context, AttributeSet attrs) {
TypedArray attributes = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.ParallaxImageView,
0, 0);

try {
speed = attributes.getDimension(R.styleable.ParallaxImageView_speed, 10);
bitmap = BitmapFactory.decodeResource(getContext().getResources(),
attributes.getResourceId(R.styleable.ParallaxImageView_src, 0));

} finally {
attributes.recycle();
}
}

我不确定这是否正是它发生的地方,或者其他方法之一是否会导致这种情况。我们还有这些方法:

@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);

if (canvas == null || bitmap == null) {
return;
}

canvas.getClipBounds(clipBounds);

while (offset <= -bitmap.getWidth()) {
offset += bitmap.getWidth();
}

float left = offset;
while (left < clipBounds.width()) {
int width = bitmap.getWidth();
canvas.drawBitmap(bitmap, getBitmapLeft(width, left), 0, null);
left += width;
}

if (isAnimating && speed != 0) {
offset -= abs(speed);
postInvalidateOnAnimation();
}
}

@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
start();
}

@Override
public void start() {
if (!isAnimating) {
isAnimating = true;
postInvalidateOnAnimation();
}
}

@Override
public void stop() {
if (isAnimating) {
isAnimating = false;
invalidate();
}
}

private Bitmap scaleToFitHeight(Bitmap bitmap, int height) {
if (height > 0) {
float factor = height / (float) bitmap.getHeight();

Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, (int) (bitmap.getWidth() * factor), height, true);
if (!newBitmap.equals(bitmap)) {
bitmap.recycle();
}

return newBitmap;
}
return bitmap;
}

private float getBitmapLeft(float layerWidth, float left) {
if (speed < 0) {
return clipBounds.width() - layerWidth - left;
} else {
return left;
}
}

我不知道是什么导致了这个问题,因为我认为我们正在正确解码和回收。不确定它是否是 6.0.1 上的特定原因导致的,但我们将不胜感激。谢谢

最佳答案

您没有正确解码图像,您应该首先检查尺寸,然后使用比例因子对其进行解码。假设您的图像是 2000 x 2000,压缩版本可能很容易小于 1mb,但将其解压缩为位图将需要 2000 * 2000 * 4 字节 = 16mb(!)
如果您确定,情况可能并非如此图像大小是可管理的,但由于您遇到了 OOM,我想这不是

请参阅 here实现细节

关于带位图的 Android OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917769/

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