【发布时间】:2011-09-07 09:16:21
【问题描述】:
我在我的 Mono for Android 应用程序中发现内存泄漏时遇到问题。我相信我正在遵循稍后概述的所有最佳实践,但在活动的一致、可重复的运行次数后,我不断收到 OutOfMemoryError。
在模拟器上使用ddms 可以看到,每次ViewFlipper 翻到下一页时,我的应用程序都会消耗大约200 个额外的“数据对象”和大约30kB 的内存。我们也在消耗其他资源,但速度要低得多。
我使用ViewFlipper 有点不合常规;它只向一个方向翻转,并去掉已经显示的Views:
while (flipper.ChildCount > 2)
{
flipper.RemoveViewAt(0);
}
我非常注意Dispose() 对我们使用过的任何Views 的任何引用,例如described in this blog post。我对所有 UI 组件都使用using 虔诚地使用(自动Dispose() 范围末尾的对象):
using (TextView questionView = header.FindViewById<TextView>(Resource.Id.question))
{
questionView.Text = question.Text;
}
这似乎对内存泄漏没有任何影响。每当我加载 Bitmaps(通常是 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 时删除处理程序对泄漏没有影响。
【问题讨论】:
标签: c# android xamarin.android