【问题标题】:How to handle many ImageViews in Android without having memory issues?如何在没有内存问题的情况下处理 Android 中的许多 ImageView?
【发布时间】:2019-04-22 05:20:18
【问题描述】:

我正在尝试在 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 个元素的静态字符串数组,代表卡片名称,一个哈希表,其中键为卡片名称,值为卡片对象,我在可绘制文件夹中拥有所有卡片的图像,名称相同因为它们在静态数组中命名,所以我可以映射它们。 我正在尝试在 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);
}

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

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】:

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

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

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

    【讨论】:

    • 谢谢,这看起来很有希望。如果效果符合我的要求,我会尝试并将其标记为答案。
    • 我忘了说:尝试禁用其中三个负责向对手展示牌的。因为他们的滚动拦截可能会导致滚动冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2019-10-16
    • 2014-05-20
    • 2021-12-03
    • 2021-12-02
    相关资源
    最近更新 更多