Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.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
Android图像内存问题_Android_Memory Leaks_Out Of Memory - Fatal编程技术网

Android图像内存问题

Android图像内存问题,android,memory-leaks,out-of-memory,Android,Memory Leaks,Out Of Memory,在我的游戏中,我有一个浏览器级别的活动。在本活动中,使用HorizontalScrollViewer一次显示25个级别。级别由LevelBrowserButtons表示,这些按钮是自定义组件。每个关卡浏览一个关卡的图像,这些图像不是很大,每个都不会超过35K 因此,使用25个按钮时,图像的大小不应超过1MB,但即使VM堆大小为24,我也会得到“java.lang.OutOfMemoryError:位图大小超过VM预算” 我的代码如下: public class LevelBrowserButto

在我的游戏中,我有一个浏览器级别的活动。在本活动中,使用HorizontalScrollViewer一次显示25个级别。级别由LevelBrowserButtons表示,这些按钮是自定义组件。每个关卡浏览一个关卡的图像,这些图像不是很大,每个都不会超过35K

因此,使用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);
  }
}

我读过很多关于有同样问题的人的帖子,但都不明白。这与正确处理位图无关,因为我甚至还没有做到这一点。

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


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

图像的分辨率(px*px)是多少?某些压缩文件格式为35KB的事实说明了位图的实际内存需求非常少。因此,您得到的位图值为350×300×3×8×25(WHBRGBYTEX)字节,即60 MB。根据屏幕大小,您可能无法在任何时间显示2-3个以上的内容,您可能需要考虑感谢Philipp。Philipp,你发布的链接都是关于ListView的,因为我的游戏都是横向模式,我想横向滚动,所以对我来说不起作用。但我意识到我不能一次添加所有按钮。我将实现某种类型的寻呼机。谢谢你的帮助。