OutOfMemoryError问题-android

OutOfMemoryError问题-android,android,bitmap,out-of-memory,image-resizing,android-drawable,Android,Bitmap,Out Of Memory,Image Resizing,Android Drawable,我的应用程序(记忆游戏)正在使用各种图像。在my/drawable/文件夹中,大约有50个大小为252x252的.png图像。我的应用程序有一些级别,例如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/Andr

我的应用程序(记忆游戏)正在使用各种图像。在my/drawable/文件夹中,大约有50个大小为252x252的.png图像。我的应用程序有一些级别,例如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/folder中的图像。例如,为了制作4x3级别,我使用了GridLayout和ImageButtons。我有一种方法,将ImageButton的位置随机化,然后将图像放入ImageButton,如下所示:

button1.setImageResource(R.drawable.logo);
对于“调整图像大小”按钮,我正在使用:

    Display display = getWindowManager().getDefaultDisplay(); 
        int screenwidth = display.getWidth();
        int screenheight = display.getHeight(); 
            button.setMaxHeight(screenwidth/3);
            button.setMaxWidth(screenwidth/3);
所以我真的不知道如何处理我的问题。也许我应该使用位图而不是ImageResource

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

2) 每个级别有24张图片。如果水平是4x3,我将获得第一个随机6张照片

3) 每个活动都使用finish();方法(如果活动已关闭/已反压)

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};

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

基本上,这是一个错误,表明您使用了过多的ram内存分配,您的代码中没有任何错误,只需要进行优化。 以下是几种方法:

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

记住变量意味着ram。

您可能需要增加堆空间。检查这里,但要注意这是一个临时修复。您可能需要找到一种更好的显示/存储图像的方法。减小图像的大小,您就完成了。正如所说的,您应该使用更小的图像或加载缩放位图,具体取决于单元格大小。你可以在这里找到一些例子。谢谢你的评论。首先,我会尽量缩小图片的大小,但我想,我的按钮至少适合7个“平板电脑处于纵向位置。我有2x2级别,因此图像大小应为screenwidth/2或screenwidth/5*2。那么,我需要将图像缩小到什么大小?可能有一些关于平板电脑大小和图片大小的信息?您如何描述“删除或重新使用图像变量空间”?我忘了说在/drawable/文件夹中还有1300x600的背景图片,大小从600kb到1.2mb。我删除了它们,改成另一个更小的,只有27kb。我不确定,但现在我无法摆脱记忆错误。我需要做更多的测试。这两个链接应该有助于基本知识:。正如我所说,降低图像的分辨率是可行的,这并不意味着你应该使用非常小的图像,而不是非常大的图像。请注意,不同的设备具有不同数量的ram,因此您仍应尽可能提高应用程序的效率,即使不会出现内存不足错误,如果您需要添加更多图像,这也会有所帮助。我没有使用过它,我假设它在必要时可用。如果你的应用程序需要所有的内存,那么就使用它,但是如果你的代码可以在没有内存的情况下运行,那么就这样做;方法在所有活动之后,哪个是关闭的/打开的?这不是个坏主意吗?很抱歉问一下,安卓系统不是很强大。