2016-07-06 29 views
1

メインのゲームアクティビティ(25+)に多くのボタンを含むXamarin.Androidアプリケーションがあります。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) 

私は本当に何が起こっているのか、それを修正する方法はわかりません。興味のある事実は、私がアプリをインストールすると、私が初めてそれを使うときに何の問題もなかったということです。私がアプリケーションを閉じて再起動すると、ボタンクリックイベントでランダムクラッシュが発生します。ボタン操作は、ImageViewに異なる背景画像を設定することです。

あなたは背景を変更する私の方法のスナップショットを見つけることができます。このlink

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

を、それがXamarinに、このJavaメソッドのようなものを使用することは可能でしょうか?

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

あまりにも多くのメモリを使用しようとしているようです。画像で重いものをやっていますか?この部分が失敗したコードを表示してください。 –

+0

@GeraldVersluis私は私の投稿を編集し、コードのサンプルを追加します。私のボタンアクションイベントは毎回このメソッドに入ります。 –

答えて

2

あなたのアプリがメモリを失うのではなく、OutOfMemoryErrorを少なくする方法はありません。

アンドロイドは、2048×1536ピクセルの1.6MB jpgファイルから得られる非圧縮画像に対して、「44236812」バイト(44メガバイト)を割り当てたいと思っています。

リソースイメージを減らそうとしましたか(ピクセル以下かピクセルあたりのビット数は少なくなりましたか)。あなたのデバイスはこの高解像度を表示できますか?

+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) 

は、トリックを行う必要があります。

関連する問題