我在我的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。
是的,我使用委託來附加到不同的'視圖'。所以我必須刪除所有使用委託的事件處理程序,或一般的所有事件處理程序?假設你有這個:'使用(Button b = FindViewById
即使從等式中刪除「Click」處理程序,我仍然以與上述相同的方式泄漏內存。 –
有趣。您的特定示例不會導致它泄漏,因爲委託是一個匿名方法,並且將位於視圖實例本身的範圍內。我想我也沒有很好地解釋自己。由於我的GameScreen已將其中一種方法附加到我的Engine類中的事件(或委託)中,所以我的漏洞已經泄漏。引擎仍然通過附加事件持有對GameScreen類的引用。不一定與泄漏有關:( – Aranda