2011-09-07 39 views
2

我在我的Mono for Android應用程序中發現內存泄漏問題。我相信我遵循了後面所述的所有最佳實踐,但是在一個活動的貫穿次數一致且可重複的數量之後,我一直在收到OutOfMemoryError。適用於Android的Mono - OutOfMemoryError

在模擬器上使用ddms我可以看到,我們的應用程序每次使用ViewFlipper時都會消耗大約200個額外的「數據對象」和大約30kB的內存。我們也在消耗其他資源,但速度要低得多。

我使用ViewFlipper有點不同尋常;它只是翻轉在一個方向,並刪除View S作已經被證明:

while (flipper.ChildCount > 2) 
{ 
    flipper.RemoveViewAt(0); 
} 

我非常注意對我們所使用的任何View小號任何引用的Dispose(),作爲described in this blog post。我用using宗教所有UI組件(其在範圍的結束時自動Dispose()的對象):

using (TextView questionView = header.FindViewById<TextView>(Resource.Id.question)) 
{ 
    questionView.Text = question.Text; 
} 

這似乎並不對內存泄漏產生任何影響。每當我加載Bitmap s(通常PNG文件,大小小於20kB)時,我都會使用相同的模式,我經常這樣做。

更新:我使用擴展方法裝載位圖:

public static Bitmap BitmapFromAsset(this Context context, String asset) 
{ 
    Bitmap bitmap; 
    using (Stream stream = context.Assets.Open(asset)) 
    { 
     bitmap = BitmapFactory.DecodeStream(stream); 
     stream.Close(); 
    } 
    return bitmap; 
} 

位圖然後被用於這樣的:

using (Bitmap b = this.BitmapFromAsset(path)) 
{ 
    imageView.SetImageBitmap(b); 
} 

更新:作爲Aranda的下面所暗示的,我使用委託,所以這是我的代碼中的一種常見模式:

using (View button = FindViewById(Resource.Id.button)) 
{ 
    button.Click += delegate 
    { 
     // do something 
    }; 
} 

更改此設置,以便在刪除View時刪除處理程序不會導致泄漏。

更新Bug posted with Xamarin with example project

回答

1

我有一個類似的,很難找到問題(在WP7上的albiet,但它仍然是相關的,因爲它都是.Net)。原來,我從另一個沒有超出範圍的類中將一些代表附加到我的GameScreen類中。確保你在做 - =任何附加的事件和委託,以及失去對視圖實例的引用。

+0

是的,我使用委託來附加到不同的'視圖'。所以我必須刪除所有使用委託的事件處理程序,或一般的所有事件處理程序?假設你有這個:'使用(Button b = FindViewById

+0

即使從等式中刪除「Click」處理程序,我仍然以與上述相同的方式泄漏內存。 –

+0

有趣。您的特定示例不會導致它泄漏,因爲委託是一個匿名方法,並且將位於視圖實例本身的範圍內。我想我也沒有很好地解釋自己。由於我的GameScreen已將其中一種方法附加到我的Engine類中的事件(或委託)中,所以我的漏洞已經泄漏。引擎仍然通過附加事件持有對GameScreen類的引用。不一定與泄漏有關:( – Aranda