Android Admob 4.1.1 имеет утечку памяти (см. Прикрепленный тестовый проект). Причина / исправить / обойти? - PullRequest
3 голосов
/ 08 октября 2011

У меня есть тестовый проект, который демонстрирует утечку памяти, вызванную Admob 4.1.1.

Основной сценарий - у меня есть два действия, и я переключаюсь назад и вперед между основным и дополнительным действием несколько раз.Затем я переключаюсь на DDMS и запускаю несколько GC.Затем сбросьте HPROF и просмотрите историческую диаграмму, отфильтрованную com.test *, чтобы увидеть, сколько существует экземпляров основного и вспомогательного действий.Мои скриншоты гистограммы прилагаются:

Утечка!leaks

Затем я прокомментировал рекламу в xml и реран, и утечек не было:

Нет утечек сейчас no leak

Я нашел несколько соответствующих постовк утечкам Admob, таким как здесь: Android AdMob вызывает утечку памяти?

Вот список вещей, которые я пытался решить:

  1. Подождите немногоколичество времени, а затем принудительное выполнение gc
  2. Не загружать объявление в oncreate, а создавать поток для ожидания, а затем загружать его
  3. Попробовал предыдущую версию Admob (ту, что не была написана Google)
  4. Вызывается adView.destroy () в методе действия onDestroy ()
  5. Открепление от этой ссылки

Очевидно, что ничего из этого не помогло.

Вот тестовый проект, который я написал:

(Не забудьте установить свой собственный идентификатор издателя при запуске тестового проекта)

скачать тест утечки Androidпроект

Если что-то изменится, я тестирую свой SGS2 с ПЗУ Cyanogenmod.

Это случается с другими людьми, когда они запускают этот проект?

Кто-нибудь знает причину исправления или обходного пути?

Спасибо

Ответы [ 3 ]

2 голосов
/ 09 октября 2011

Мое приложение использует 80% разрешенных 16 МБ, и AdView протекает при каждом изменении ориентации (так как тогда Android уничтожает и воссоздает всю активность).В результате у меня не хватает памяти после дюжины изменений ориентации, и мне страшно:

10-08 10: 14: 47.178: ОШИБКА / dalvikvm-heap (2876): 1440000-байтовое внешнее распределение тожебольшой для этого процесса.

10-08 10: 14: 47.178: ОШИБКА / dalvikvm (2876): Недостаточно памяти: Размер кучи = 5191 КБ, Выделено = 2877 КБ, Размер растрового изображения = 18675 КБ

10-08 10: 14: 47.178: ОШИБКА / GraphicsJNI (2876): ВМ не позволяет выделять 1440000 байт

или аналогичных.

Увеличение памяти можно легко увидеть в затмениивыполнив отладочный прогон и открыв Окно> Открыть перспективу> Другое> DDMS, щелкнув значок «Обновить кучу» и выполнив GC «Причина».Самый простой способ проверить imho - это #Objects.Если ориентация изменилась с книжной на альбомную и обратно, количество объектов должно быть одинаковым (и без AdView).

Я работаю над утечкой памяти, делая AdView статичным

private static AdView mAdView = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(mAdView == null)
    {
        mAdView = new AdView(this, AdSize.BANNER, ADMOB_PUBLISHER_ID);
    }
}

и не вызывать уничтожение

@Override
public void onDestroy() {
    super.onDestroy();
    //mAdView.destroyDrawingCache();
    //mAdView.destroy();
    //mAdView = null;
}

По крайней мере, это предотвращает утечки памяти между каждым изменением ориентации.

Также я установил запрос на null после его использования.Не знаю, поможет ли это.

    AdRequest request = new AdRequest();
    mAdView.loadAd(request);
    request = null;
1 голос
/ 15 января 2013

Мое решение

private void destroyWebView(ViewGroup viewGroup) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
    if (viewGroup.getChildAt(i) instanceof WebView) {
        WebView view = (WebView) viewGroup.getChildAt(i);
        viewGroup.removeView(view);
        view.destroy();
        return;
    }
}
}

@Override
protected void onDestroy() {
mAdView.stopLoading();
destroyWebView(mAdView);
((ViewGroup) mAdView.getParent()).removeView(mAdView);
0 голосов
/ 18 октября 2011

Да, я все это создаю динамически.Я использую removeAllViews для удаления всех представлений из моего контейнера (LinearLayout).Затем я использую addView, чтобы вернуть их снова.Объявление кликабельно.Может быть, в вашем случае есть какой-нибудь прозрачный вид перед ним?

...