Android在不同的活动中加载不同大小的不同位图

时间:2016-06-08 08:43:40

标签: android bitmap size out-of-memory scaling

大家早上好,

我的Android应用程序在内存使用方面存在很大问题。我的应用程序提供(目前)22张纸牌游戏。每个游戏都是具有自己特定布局的活动。它们位于res / layout文件夹中,所有包含的视图都具有width和height = 0dp。加载布局后,我根据屏幕尺寸,首选卡座类型(可用7种类型)和布局本身计算卡片的最大可能尺寸(视图),并将计算出的尺寸设置为每张显示的卡片(最坏的情况是那里)是同时显示的52张牌)。卡片图像(单张图片大约100kb)都在资产文件夹中(assets / $ {deck_type} /a1.png ... assets / $ {deck_type} /a52.png)。 因此,每个游戏都有其特定卡片大小的布局(仅在运行时才知道)。现在我的问题是,在玩了大约6/7种不同的游戏之后,我在加载位图或加载新的游戏布局时会遇到OutOfMemory。如果改变甲板类型,OOM大约到3/4场比赛。 最初我在LruCache中加载了首选deck类型的所有卡片图像(并且仅在用户卡片类型更改后重新加载),然后调用

cardView.setImageDrawable(cardImages.get(card));

显示cardView时。但是有了这个解决方案,OOM几乎很快就会到来。 所以我保留了这种方法但是使用了Bitmap(而不是Drawable),加载了com.nostra13.universalimageloader.core.ImageLoader:稍微好一点,但还不是很好。所以我已经停止在需要时使用完全预加载的LruCache和同步加载位图,根据游戏卡大小缩放它们

private void scaleImage(int newWidth) {
    int width = scaled.getWidth();
    int height = scaled.getHeight();

    float scaleWidth = ((float) newWidth) / width;
    float ratio = ((float) scaled.getWidth()) / newWidth;
    int newHeight = (int) (height / ratio);
    float scaleHeight = ((float) newHeight) / height;

    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);

    System.gc();
    scaled = Bitmap.createBitmap(scaled, 0, 0, width, height, matrix, true);

}

并将它们缓存在LruCache中,在游戏结束时被驱逐,并在我的活动游戏OnDestroy中调用

System.gc()

但似乎没有效果。

更好一点但是OOM没有被避免。 我还研究了所有五章https://developer.android.com/training/displaying-bitmaps/index.html

但是我无法根据自己的需要调整它们。

我该如何解决这个问题?你知道另一种方法吗? 非常感谢你。

0 个答案:

没有答案