0

我正在开发一款安卓游戏。我使用 xml 文件创建 2 个菜单。当它们具有相同的背景时,菜单可以正常工作,但是当它们具有不同的背景时,程序会因 OutOfMemoryError 而崩溃。

这是两个 xml 文件的样子:

文件 1:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="wrap_content"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content"
        android:background="@drawable/background">

                Bunch of TextViews

文件 2 完全相同,只是背景是 @drawable/background2

我得到的 LogCat 错误是:

E/AndroidRuntime(534): FATAL EXCEPTION: GLThread
E/AndroidRuntime(534): java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:605)

我不太确定这个错误与我更改背景图像有何关系,而且问题与我正在使用的背景图像的大小无关。我尝试使用一张 800KB 的背景图片并没有问题,但是当我尝试两张大约 150KB 的不同背景图片时出现错误。

我有一个创建菜单的活动:

 public class MenuActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_new); 

任何帮助将不胜感激。谢谢

4

2 回答 2

0

该问题与我使用的背景图像的大小无关。

实际上,它是,尽管size的含义不同。文件大小在运行时并不重要,因为在内部 Android 将所有图像加载为BitmapsARGB_8888格式。这意味着每个像素由 4 个字节表示,并且视觉大小(图像尺寸/分辨率)决定了显示图像所需的内存。例如,一个 800 x 480 像素的图像在运行时需要 800 * 480 * 4 = 1536000 字节,或大约 1.5 MB。

话虽如此,应该清楚为什么为 Android 指定的不同密度桶提供资产很重要。如果您还没有阅读“支持多个屏幕”指南,我强烈建议您这样做。提供正确大小的资产可能会显着提高内存使用率,尽管它通常以更大的 apk 为代价。

此外,您还有更多选择。例如,如果背景图像的内容允许,则将它们转换为9-patches。您还可以尝试以(出于质量原因不推荐使用)ARGB_4444格式加载图像,与ARGB_8888.

最后,根据您的实现细节,您可以通过手动释放资源(例如通过调用对象)来提高运行时的内存recycle()使用率Bitmap。尽管 Dalvik VM 也会处理垃圾收集未引用的资源,但它可能需要几个周期才能真正发生。显式释放资源有时会有所帮助,例如,如果您仅加载Bitmaps 以将它们作为纹理传递到 OpenGL 管道,则这是常见的做法。此外,如果您使用 OpenGL 纹理,请不要忘记调用gl.glDeleteTextures(...)以释放包含您不再需要的纹理的内存。

于 2012-05-19T03:15:27.593 回答
0

您可以清除垃圾收集器。它

@Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        Runtime.getRuntime().gc();
        System.gc();
        super.onDestroy();
    }
于 2012-05-19T03:08:52.277 回答