如何在Android中处理许多ImageView而又没有内存问题?

时间:2019-04-21 20:49:45

标签: java android out-of-memory android-imageview

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

我只想进行纸牌分配(发牌),将52张纸牌分配给屏幕上WEST,SOUTH,EAST和NORTH的每个玩家。

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

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

我有一个静态字符串字符串,其中包含52个表示卡名的元素,一个哈希表具有卡名和卡对象的值,并且我在drawable文件夹中拥有所有卡的图像,命名相同因为它们是在静态数组中命名的,所以我可以映射它们。 我正在尝试在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循环中引发。

现在,这无疑是处理该问题的错误方式。对于这种游戏,我应该遵循的最佳方法是什么?这些图像将在游戏的整个生命周期中都显示在屏幕上,并且还会有简单的动画,例如挑选要扔的卡并将其扔掉。

如何处理这种情况?怎样才能避免将来游戏中出现内存问题?

1 个答案:

答案 0 :(得分:2)

在我看来,发生这种情况是因为您在Linearlayout中添加了太多视图,并使视图层次结构变厚而没有任何深度。

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

如果有任何可能不起作用,请尝试将那些RecyclerViews包装在Fragments中。