制作一个包含许多图像的安卓游戏,如何避免许多图像的java.lang.OutOfMemory错误

时间:2014-07-15 20:21:08

标签: java android out-of-memory

我一直在搜索Google,Stack Overflow和Android开发人员的指南,但是,我无法很好地解决这个问题。

我尝试过unbind drawables方法:

      unbindDrawables(View view) 
 {
    if (view.getBackground() != null) 
    {
       view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup) 
    {
       for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) 
       {
          unbindDrawables(((ViewGroup) view).getChildAt(i));
       }
       ((ViewGroup) view).removeAllViews();
    }
 }

我无法从android文档中有效地加载大型位图,因为我制作图像的大小是我想要的最大尺寸(740 x 1140 png),我不知道其他尺寸我可以插入电话:

        mImageView.setImageBitmap(
decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

此外,每个活动都有一个740x1140 png背景,其他较小的图像视图可用于敌人,按钮和东西。我一次在屏幕上看到的最多是8个。我通过XML分配所有这些图像。但是,我在开始一个新活动后完成了每个活动,但似乎没有释放内存。

下面是我的开始布局和logcat。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bro_quest_start_bg"
android:orientation="vertical"
android:scaleType="centerCrop"
tools:context="com.torch2424.broquest.StartScreen" >

<ImageView
    android:id="@+id/broquesttitle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/rrppgg_title"
    android:contentDescription="@string/tank" />

<Button
    android:id="@+id/start"
    android:layout_width="120dp"
    android:layout_height="55dp"
    android:background="@drawable/buttons"
    android:onClick="fight"
    android:layout_gravity="center_horizontal"
    android:text="@string/start" />

 <Button
    android:id="@+id/journal"
     android:layout_width="120dp"
    android:layout_height="55dp"
    android:background="@drawable/buttons"
     android:layout_gravity="center_horizontal"
    android:onClick="journal"
    android:text="@string/journal" />

   <Button
    android:id="@+id/character"
     android:layout_width="120dp"
    android:layout_height="55dp"
    android:background="@drawable/buttons"
     android:layout_gravity="center_horizontal"
    android:onClick="character"
    android:text="@string/character" />

<Button
    android:id="@+id/shop"
    android:layout_width="120dp"
    android:layout_height="55dp"
    android:background="@drawable/buttons"
     android:layout_gravity="center_horizontal"
    android:onClick="shop"
    android:text="@string/shop" />


<Button
    android:id="@+id/options"
     android:layout_width="120dp"
    android:layout_height="55dp"
    android:background="@drawable/buttons"
     android:layout_gravity="center_horizontal"
    android:onClick="options"
    android:text="@string/options" />

<Button
    android:id="@+id/quit"
     android:layout_width="120dp"
    android:layout_height="55dp"
     android:layout_gravity="center_horizontal"
    android:background="@drawable/buttons"
    android:onClick="quit"
    android:text="@string/quit" />

链接到Logcat,Log cat格式对堆栈溢出不会很好:( http://pastebin.com/dZSPaq4d

P.S图像在我的可绘制文件夹中都是可绘制的

2 个答案:

答案 0 :(得分:1)

尝试使用像Picasso这样的图像缓存库。

答案 1 :(得分:1)

就像Voicu上面说的那样,我收到了OOM错误,因为我的drawables位于错误的文件夹中。昨晚我正在浏览互联网,并在谷歌搜索结果中发现了这个问题:Android setBackgroundResource cause out of memory excepiton

在哪里,他描述了他如何将他的图像从drawable文件夹移动到drawable-nodpi文件夹,并解决了他所有的OOM问题。所以我尝试了我的应用程序,它也运行良好。但是,图像确实看起来有点不同,所以要弄清楚为什么会这样,让我们​​引用一些Android文档:

“drawable /中的资源是默认的可绘制资源。系统假定默认资源是针对基线屏幕尺寸和密度设计的,这是正常的屏幕尺寸和中等密度。因此,系统会缩放默认密度适用于高密度屏幕和低密度屏幕的资源。“

所以,在我的情况下,我在“SD”图像和手机的文件夹中为“高清”手机放置“高清”图像,因为那也是可绘制的/默认的。所以反过来,它会扩展我所有的“高清”图像比实际需要的更大,这不仅使它们看起来更糟,而且还会使它们在堆上使用更多内存导致OOM(内存不足) )我的应用程序中的错误。

有关drawables文件夹和DPI的更多信息,请参阅Android文档的此链接:http://developer.android.com/guide/practices/screens_support.html

每个活动的OnDestroy()中的P.SUnbind Drawables确实对内存有帮助,所以如果你有任何内存问题,我建议你试试这个。通过这个调用,人们经常会调用System.gc(),这确实有帮助,但这是错误的编码实践。但在我的情况下,它特别是/ drawables的东西。另外,我偶然发现tinypng.com减少了PNG大小,它根本没有帮助解决OOM错误,但它确实减少了你的apk大小,所以我建议你为你的游戏和事情做这个,因为它减少了文件大小几乎没有明显的区别。