2016-07-06 174 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) 

應該做的伎倆。