Mono для Android - OutOfMemoryError - PullRequest
       0

Mono для Android - OutOfMemoryError

2 голосов
/ 07 сентября 2011

У меня проблемы с обнаружением утечки памяти в приложении 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 с примером проекта .

1 Ответ

1 голос
/ 07 сентября 2011

У меня была немного похожая проблема, и ее было очень трудно найти (albiet на WP7, но она все еще актуальна, поскольку все это .Net). Оказалось, что я прикрепил некоторых делегатов к своему классу GameScreen из другого класса, который не вышел за рамки. Убедитесь, что вы делаете - = любые прикрепленные события и делегаты, а также теряете ссылку на экземпляр представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...