2011-10-31 91 views
1

我在我的游戏浏览器级别上有一个活动。在此活动中一次显示25个水平Horizo​​ntalScrollViewer。级别由作为自定义组件的LevelBrowserButtons表示。每个LevelBrowserButton图像的水平和这些图像都不是很大,每个都不超过35K。Android图像内存问题

因此,使用25个按钮时,它不应该使用超过1MB的图像,但即使VM堆大小为24我也会得到“java.lang.OutOfMemoryError:位图大小超过VM预算”。

我的代码如下:

public class LevelBrowserButton extends LinearLayout 
{ 
    int LayoutNumber = 1; 


    public LevelBrowserButton(Context context, String layoutName, int layoutNumber) 
    { 
    super(context); 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);          
    inflater.inflate(R.layout.levelbrowser_button, this); 

    LayoutNumber = layoutNumber; 

    // Set Layout Name 
    TextView nameTextView = (TextView) findViewById(R.id.NameTextView); 
    nameTextView.setText(layoutNumber + ": " + layoutName); 

    // Set Layout Image 
    int imageResource = this.getResources().getIdentifier("levelbrowser_" + layoutNumber, "drawable", "mobile.firegame"); 
    ImageView backgroundImageView = (ImageView)findViewById(R.id.BoardImageView); 
    backgroundImageView.setImageResource(imageResource); 

    // Set Status Image 
    ImageView statusImageView = (ImageView)findViewById(R.id.StatusImageView); 
    if (Settings.getLevelStats(layoutName).Completed) 
     statusImageView.setImageResource(R.drawable.levelbrowser_completed); 
    else 
     statusImageView.setImageResource(R.drawable.levelbrowser_uncompleted); 
    } 
} 

我看了相当多的具有相同类型问题的人的线程,但无法弄清楚。这与正确处理Bitmaps没有关系,因为我甚至无法获得这么好的效果。

+1

什么是您的图像的分辨率(px * px)?某些压缩文件格式为35KB的事实对Bitmap的实际内存要求几乎没有提及。 –

+0

它们是350x300。 – Moresby

+0

因此,您已经获得了350 * 300 * 3 * 8 * 25(w * h * rbg * byte *图像)字节的Bitmaps,即60 MB ---根据屏幕大小,您可能无法显示超过2 -3他们在任何时候,你可能要考虑http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview –

回答

0

这是一个类似的问题,我回答并展示了如何去动态加载正确的图像大小。

内存不足异常+分析hprof文件转储