Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中处理许多图像视图而不出现内存问题?_Java_Android_Out Of Memory_Android Imageview - Fatal编程技术网

Java 如何在Android中处理许多图像视图而不出现内存问题?

Java 如何在Android中处理许多图像视图而不出现内存问题?,java,android,out-of-memory,android-imageview,Java,Android,Out Of Memory,Android Imageview,我试图在Android Studio中开发一个简单的纸牌游戏,由四名玩家玩。但我一开始就在挣扎。我不熟悉android编程,但不熟悉Java开发 我只想做卡片分发(卡片交易),这将把52张卡片分割给每个玩家,分别位于屏幕上的西、南、东、北 所以我猜,我需要52个代表卡片的ImageView,所以我创建了一个类: public class Card extends ImageView { public Card(Context context, int id) { super(cont

我试图在Android Studio中开发一个简单的纸牌游戏,由四名玩家玩。但我一开始就在挣扎。我不熟悉android编程,但不熟悉Java开发

我只想做卡片分发(卡片交易),这将把52张卡片分割给每个玩家,分别位于屏幕上的西、南、东、北

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

public class Card extends ImageView {
  public Card(Context context, int id) {
    super(context);
    setImageResource(id);
  }
}
我有一个静态字符串数组,包含52个表示卡片名称的元素,一个哈希表,其中包含卡片名称的键和卡片对象的值,我有drawable文件夹中所有卡片的图像,它们的名称与静态数组中的名称相同,因此我可以映射它们。 我试图在主要活动中做到这一点:

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循环中抛出

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


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

在我看来,这是因为您在线性布局中添加了太多视图,并使视图层次结构变得厚实而没有任何深度

我认为解决这个问题最好的方法是使用RecyclerView,因为它有自己的内存管理方式。你们甚至可以在屏幕上使用自定义的曲线来绘制那个些卡片(比如,若它们是手持的)。 两个垂直循环视图和两个水平循环视图将完成此工作


如果它不起作用,请尝试将这些RecyclerViews打包。

在我看来,之所以发生这种情况,是因为您在线性布局中添加了太多视图,并使视图层次结构厚而没有任何深度

我认为解决这个问题最好的方法是使用RecyclerView,因为它有自己的内存管理方式。你们甚至可以在屏幕上使用自定义的曲线来绘制那个些卡片(比如,若它们是手持的)。 两个垂直循环视图和两个水平循环视图将完成此工作


如果它不起作用,请尝试将这些RecyclerViews打包。

谢谢,这看起来很有希望。我会尝试一下,如果我想要的话,我会把这个标记为答案。我忘了提到:试着禁用三个负责显示对手牌的人。因为他们的卷轴截取可能会导致卷轴冲突。谢谢,这看起来很有希望。我会尝试一下,如果我想要的话,我会把这个标记为答案。我忘了提到:试着禁用三个负责显示对手牌的人。因为他们的卷轴截取可能会导致卷轴冲突。