如何在没有内存问题的情况下处理Android中的许多ImageView?

问题描述 投票:0回答:1

我正在尝试在Android Studio中开发一个简单的纸牌游戏,由四个玩家玩。我在一开始就在苦苦挣扎。我是android编程的新手,但不是Java开发的。

我只是想进行卡片发行(卡片处理),这将把52张卡片分成每个播放器,位于屏幕的WEST,SOUTH,EAST,NORTH。

所以我猜,我将需要52个代表卡片的ImageViews,所以我创建了一个类:

public class Card extends ImageView {
  public Card(Context context, int id) {
    super(context);
    setImageResource(id);
  }
}

我有一个静态数组的字符串,其中52个元素代表卡片名称,哈希表用于键入卡片名称和值卡片对象,我有可绘制文件夹中所有卡片的图像,名称与它们相同在静态数组中命名,所以我可以映射它们。我想在MainActivity中这样做:

for (String cardName : cardNames) {
  int imageId = Utilities.getResId(cardName, R.drawable.class);//this just 
  //gets the id of the image in R
  Card card = new Card(this, imageId);
  cards.put(cardName, card);
  linearLayout.add(card);
}

我还通过调用方法在内容视图中设置了上面填充的linearLayout:

setContentView(linearLayout);

我得到的错误是

java.lang.OutOfMemoryError: Failed to allocate a 11675148 byte allocation with 10183056 free bytes and 9MB until OOM.

在大约第15个循环的for循环中抛出此错误。

现在这肯定是处理这个问题的错误方法。对于这种游戏,我应该遵循的最佳方法是什么?在整个游戏生命周期中,图像将出现在屏幕上,并且还会有简单的动画,比如选择投掷和投掷的牌。

如何处理这种情况以及什么是避免将来游戏中的内存问题的解决方案?

java android out-of-memory android-imageview
1个回答
2
投票

在我看来,它发生的原因是你在Linearlayout中添加了太多的视图,并使你的视图层次结构厚而没有任何深度。

我认为最好的方法是使用RecylerView解决这个问题因为RecyclerView有自己的内存管理方式。您甚至可以使用自定义LayoutManager在屏幕上绘制这些卡片(就像它们握在手上一样)。两个垂直RecyclerViews和两个水平将完成这项工作。

如果它不起作用,尝试将这些RecyclerViews包装在Fragments中。

© www.soinside.com 2019 - 2024. All rights reserved.