加载位图Android列表时出现OOM错误

时间:2015-03-08 20:29:39

标签: android bitmap out-of-memory scaling

我试图在Android中创建一个单人纸牌游戏,所以我试图为一副纸牌加载图像(总共53个图像,52个用于前面,一个用于后面的牌)。图像加载得很好,但是当我尝试缩放它们以适应任何设备的屏幕时,我通常在第13张卡片周围出现内存不足错误。这是我扩展卡片的方法:

public ArrayList<Card> mapBitmapToCard(ArrayList<Card> listOfCards, ArrayList<Bitmap> listOfImages, int screenHeight){
        ArrayList<Card> result = new ArrayList<>();
        for (int i = 51 ; i >= 0 ; i--){
            Card card = listOfCards.get(i);
            card.setScaleFactor(screenHeight);
            Bitmap cardFront = listOfImages.get(i);
            listOfImages.remove(i);
            card.image = Bitmap.createScaledBitmap(cardFront, (int) (cardFront.getWidth() * card.scaleFactor), (int) (cardFront.getHeight() * card.scaleFactor), true);
            cardFront.recycle();
            Bitmap back = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.card_back));
            card.back = Bitmap.createScaledBitmap(back, (int) (back.getWidth() * card.scaleFactor), (int) (back.getHeight() * card.scaleFactor), true);
            back.recycle();
            result.add(card);
            System.out.println("" + (52 - i) + " cards completed");
        }
        return result;
    }

有没有办法解决这个问题,可以更有效地完成这项工作?

1 个答案:

答案 0 :(得分:1)

一个直接的想法是不加载所有这些,然后扩展所有这些。加载后立即缩放它们,然后立即回收原始图像。这种方式,而不是任何时候53个未缩放和n个缩放的图像,你有1个未缩放和n缩放。

您还可以创建52个不同的缩放后图像副本。不要这样做。缩放一次并重复使用相同的参考 - 制作52份是浪费内存,可能是您的问题。无论如何,对于所有52,背面都是相同的不是吗?