У меня проблемы с обнаружением утечки памяти в приложении Mono для Android. Я полагаю, что я следую всем лучшим рекомендациям, изложенным позже, но я продолжаю получать OutOfMemoryError после последовательного, воспроизводимого числа прогонов действия.
Используя ddms
на эмуляторе, я вижу, что мое приложение потребляет около 200 дополнительных «объектов данных» и около 30 КБ памяти каждый раз, когда наш ViewFlipper
переходит на следующую страницу. Мы также потребляем другие ресурсы, но с гораздо меньшей скоростью.
Я использую ViewFlipper
немного нетрадиционно; он переворачивается только в одном направлении и удаляет View
s, которые уже были показаны:
while (flipper.ChildCount > 2)
{
flipper.RemoveViewAt(0);
}
Я очень внимательно следил за Dispose()
любыми ссылками на любые View
s, которые мы использовали, как описано в этом посте 1014 *. Я использую using
неукоснительно для всех компонентов пользовательского интерфейса (которые автоматически Dispose()
объект в конце области):
using (TextView questionView = header.FindViewById<TextView>(Resource.Id.question))
{
questionView.Text = question.Text;
}
Это, похоже, не влияет на утечку памяти. Я использую один и тот же шаблон всякий раз, когда загружаю Bitmap
с (обычно файлы PNG, размером менее 20 КБ), что я делаю довольно часто.
Обновление : Я загружаю растровые изображения, используя метод расширения:
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);
}
Обновление : Как предлагает Аранда ниже, я использую делегатов, так что это общий шаблон в моем коде:
using (View button = FindViewById(Resource.Id.button))
{
button.Click += delegate
{
// do something
};
}
Изменение этого параметра таким образом, чтобы я удалял обработчики при удалении View
, не влияет на утечку.
Обновление : Ошибка с Xamarin с примером проекта .