2016-07-06 124 views
1

我有一个Xamarin.Android应用程序,其主游戏活动(25岁以上)包含大量按钮。Xamarin Android运行时异常

当我按下一个按钮,我随机在我的应用程序上崩溃。我有崩溃的以下日志:

Xamarin caused by: java.lang.OutOfMemoryError: Failed to allocate a 44236812 byte allocation with 8344256 free bytes and 7MB until OOM 
    at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856) 
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675) 
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2228) 
    at android.content.res.Resources.loadDrawableForCookie(Resources.java:4211) 
    at android.content.res.Resources.loadDrawable(Resources.java:4085) 
    at android.content.res.Resources.getDrawable(Resources.java:2005) 
    at android.content.res.Resources.getDrawable(Resources.java:1987) 
    at android.content.Context.getDrawable(Context.java:464) 
    at android.view.View.setBackgroundResource(View.java:18532) 
    at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method) 
    at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29) 
    at android.view.View.performClick(View.java:5702) 
    at android.widget.TextView.performClick(TextView.java:10888) 
    at android.view.View$PerformClick.run(View.java:22541) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7229) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

我不知道到底happends以及如何解决它。一个有趣的事实是,当我安装该应用程序时,我第一次使用它时没有遇到任何问题。如果我关闭应用程序并重新启动它,那么随机出现按钮单击事件。按钮操作是在ImageView上设置不同的背景图像。

你可以找到我的方法的快照谁更改背景:

private void SetErrorImage(ImageView component, int errorNumber) 
{ 
    switch (errorNumber) 
    { 
     case 0: 
      component.SetBackgroundResource(Resource.Drawable.arbre_00); 
      break; 
     case 1: 
      component.SetBackgroundResource(Resource.Drawable.arbre_01); 
      break; 
     case 2: 
      component.SetBackgroundResource(Resource.Drawable.arbre_02); 
      break; 
     case 3: 
      component.SetBackgroundResource(Resource.Drawable.arbre_03); 
      break; 
     case 4: 
      component.SetBackgroundResource(Resource.Drawable.arbre_04); 
      break; 
     case 5: 
      component.SetBackgroundResource(Resource.Drawable.arbre_05); 
      break; 
     case 6: 
      component.SetBackgroundResource(Resource.Drawable.arbre_06); 
      break; 
     case 7: 
      component.SetBackgroundResource(Resource.Drawable.arbre_07); 
      break; 
    } 
} 

在此之后link,是否有可能使用类似的Xamarin这个Java方法?

((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); 
+0

看起来你试图使用太多的内存。你是否在用图像做一些沉重的事情?你能不能在这部分代码失败的地方显示代码? –

+0

@GeraldVersluis我编辑我的帖子并添加一个代码示例。我的按钮动作事件每次都进入此方法。 –

回答

2

不是你的应用程序失去内存的原因,而是一种使OutOfMemoryError不太可能的方式。

我看到,android想为未压缩的图像分配“44236812”字节(44兆字节),该图像可能来自2048 * 1536像素1.6MB jpg文件。

你是否试图减少你的资源图像(更少的像素或更少的位像素)?您的设备是否能够显示此高分辨率?

+1

我解决了调整图像大小的问题。我有720 * 960像素的图像,他们现在是300 * 400像素。问题解决了。然而,我读到建议有像'drawable-mdpi','drawable-hdpi','drawable-xhdpi','drawable-xxhdpi'这样的文件夹,但是我想知道我可以在每个文件夹中放置什么样的解决方案。 –

+0

你应该留意你的记忆,并检查它是否保持稳定,当你旋转你的应用程序或做一些图像重新创建一堆。你“可能”现在通过缩小图像来减少内存问题,尽管你不应该使用大的图像。 对于你的问题,请查看https://developer.android.com/guide/practices/screens_support.html。 – Cyriac

0

正如你有点想,你需要正确地释放图像。 即使只是多次改变方向,只会分配越来越多的内存,如果你不正确地释放它。

基本上只是

imageView.SetImageDrawable(null) 

应该做的伎俩。