我正在尝试在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循环中引发。
现在,这无疑是处理该问题的错误方式。对于这种游戏,我应该遵循的最佳方法是什么?这些图像将在游戏的整个生命周期中都显示在屏幕上,并且还会有简单的动画,例如挑选要扔的卡并将其扔掉。
如何处理这种情况?怎样才能避免将来游戏中出现内存问题?
答案 0 :(得分:2)
在我看来,发生这种情况是因为您在Linearlayout中添加了太多视图,并使视图层次结构变厚而没有任何深度。
我认为最好的方法是使用RecylerView解决此问题,因为RecyclerView有其自己的内存管理方式。您甚至可以使用自定义LayoutManager在屏幕上弯曲这些卡片(例如,将它们握在手上)。 两个垂直的RecyclerViews和两个水平的RecyclerViews将完成此工作。
如果有任何可能不起作用,请尝试将那些RecyclerViews包装在Fragments中。