OutOfMemoryError问题 - android

时间:2014-04-16 20:32:15

标签: android bitmap out-of-memory image-resizing android-drawable

我的应用程序(记忆游戏)正在使用各种图像。在我的/ drawable /文件夹中大约有~50个像素,大小为252x252。我的应用程序有一些级别,例如4x3,4x6等。经过3-4场比赛(例如,我从2x2开始到4x6) - 我的应用程序崩溃(不幸的是,你的应用已停止)。在LogCat中,我有以下错误:

04-16 23:05:35.382: E/AndroidRuntime(13622): FATAL EXCEPTION: main
04-16 23:05:35.382: E/AndroidRuntime(13622): java.lang.OutOfMemoryError
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.graphics.Bitmap.nativeCreate(Native Method)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:530)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:505)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:357)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:777)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.content.res.Resources.loadDrawable(Resources.java:1940)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.content.res.Resources.getDrawable(Resources.java:669)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.view.View.setBackgroundResource(View.java:11861)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at com.example.testlogo.MainActivity.onCreate(MainActivity.java:145)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.app.Activity.performCreate(Activity.java:4465)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.app.ActivityThread.access$600(ActivityThread.java:127)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.os.Looper.loop(Looper.java:137)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at android.app.ActivityThread.main(ActivityThread.java:4448)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at java.lang.reflect.Method.invokeNative(Native Method)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at java.lang.reflect.Method.invoke(Method.java:511)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
04-16 23:05:35.382: E/AndroidRuntime(13622):    at dalvik.system.NativeStart.main(Native Method)

正如我所说,我正在使用/ drawable /文件夹中的图像。为了使例如4x3级别,我使用GridLayout和ImageButtons。我有一个方法,随机化ImageButton的位置,然后我将图像放到ImageButton,如下所示:

button1.setImageResource(R.drawable.logo);

为了调整我的ImageButton大小,我正在使用:

    Display display = getWindowManager().getDefaultDisplay(); 
        int screenwidth = display.getWidth();
        int screenheight = display.getHeight(); 
            button.setMaxHeight(screenwidth/3);
            button.setMaxWidth(screenwidth/3);

所以我真的不知道,如何解决我的问题。也许我应该使用Bitmap而不是ImageResource?

注意: 1)每个级别都有自己的类,它们彼此非常相似。

2)每个关卡都有24张图片。如果等级是4x3,我会得到第一个随机的6个图片。

3)每个活动都使用finish();活动关闭/ onBackPressed的方法。

int[] img ={R.drawable.cherry90,R.drawable.apple90,R.drawable.applered90,R.drawable.apricot90,R.drawable.banana90,R.drawable.blueberry90,


R.drawable.coconut90,R.drawable.gooseberry90,R.drawable.grape90,R.drawable.grapefruit90,R.drawable.kiwi90,R.drawable.lemon90,
                R.drawable.lime90,R.drawable.mandarin90,R.drawable.mango90,R.drawable.melon,R.drawable.papaya90,R.drawable.peach90,
                R.drawable.pears90,R.drawable.pineapple,R.drawable.plums90,R.drawable.pomegranate90,R.drawable.raspberry90,R.drawable.strawberry90};

我希望你能理解我想说的话。我正在寻找这个问题的答案,但没找到。

1 个答案:

答案 0 :(得分:0)

基本上它是一个错误,表明你已经使用了过多的ram内存分配,你的代码中没有任何错误只需要优化。 以下是一些方法:

  • 降低图像的分辨率,你仍然可以将它们拉伸到相同的尺寸,但它们不会显示出太多细节。
  • 删除或重复使用图像变量空间。
  • 如果您在屏幕上多次显示相同的图像,就像大多数平铺地图一样。只创建一个存储图像的变量。

记住变量意味着ram。