我的应用程序使用了太多的内存,我不太确定为什么。我在做一个纸牌游戏。我使用10个等宽RelativeLayouts的链式ConstraintLayout (每叠卡片1个)。我知道我可以使用其他视图组。
我的应用程序使用了大约15MB内存,直到我这样做;
public void DrawCardsMat0()
{
RelativeLayout mat = (RelativeLayout) findViewById(R.id.PLAY_Mat0);
mat.removeAllViews();
RelativeLayout rl = new RelativeLayout(this);
for (PlayingCard playingCard : Stack0.Cards)
{
ImageView myImg = GetCardImage(playingCard);
RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(CardWidth, CardHeight);
lay.setMargins(0, playingCard.UI_MarginTop, 0, 0);
mat.addView(myImg, lay);
}
}和
public ImageView GetCardImage(PlayingCard playingCard)
{
ImageView myImg = new ImageView(this);
// a simple switch is used to here to pick the drawable. Removed as there's 52 cards)
myImg.setImageResource(R.drawable.s1);
return myImg;
}CardWidth和CardHeight是整型的(大概是150和210。像素)。
这将抽出五张牌,每个.jpg大小约为60KB(是的,KB)。这将导致60MB的内存使用。10个cols == 600mb内存(我假设,因为在此之前它是面向对象的)。
这些图像位于RelativeLayout中,并且一张一张地放置。MarginTop被用来“堆叠”它们。
提前感谢
-更新1
我现在使用的是46KB的bmp图像。在XML中创建5 ImageViews (一个堆栈的值)(并且不要在代码中调用任何东西)使用大约50MB的内存。已使用LinearLayout测试。在代码中创建相同的图像使用相同数量的内存。
-更新2-如果我创建一个新的活动,只有一个简单的LinearLayout和5个ImageViews,没有java代码,它仍然使用大约50MB的内存。
发布于 2017-03-01 06:19:01
在使用位图时,您应该始终小心。我将描述最重要的几点,并考虑到它们,您可以改变组织卡片图像的方式。
内存中的
.jpg/.png/.webp/.[whatever compressed format].的大小不同实际大小取决于Bitmap.Config,但默认情况下,安卓将使用ARGB_8888 (1字节用于alpha通道,1字节用于R/G/B通道)。你可以通过以.bmp格式保存图像来粗略估计内存的大小。<bitmap>标签时,这意味着在运行时位图将被包装在BitmapDrawable中。myImg.setImageResource(R.drawable.s1)时,它意味着位图将具有和以前在内存中相同的大小,它将只是通过使用矩阵来缩放,这取决于你specified.ImageView和scaleType的大小,可能你想加载缩小的位图到内存,这取决于视图的大小。您可以通过使用BitmapFactory类来完成此操作。我建议你阅读这两篇文章,以了解安卓是如何处理位图的:Loading Large Bitmaps Efficiently.ImageView的大小加载缩小的位图。你也可以尝试使用Fresco,它将位图保存在JVM堆之外。SVG格式的卡片。然后,您可以使用矢量而不是位图,后者对内存更友好(因为SVG只是一组关于如何绘制的指令)。然而,在真正复杂的SVG文件的情况下,你可能遇到另一个问题-它将花费大量的时间来绘制它。有关如何在ImageView.中使用它,请查看this文章
https://stackoverflow.com/questions/42519237
复制相似问题