Утечка памяти при использовании промежуточной рекламы Admob

У меня есть служба, которая будет показывать активность в определенный момент времени, после этой активности каждый 13-й раз я показываю рекламные вставки. Использование оперативной памяти моего приложения увеличивается на 20 МБ при показе промежуточной рекламы, после чего она не получает мусор. В следующий 13-й раз, когда показывается другая промежуточная реклама, объем служебной памяти не увеличивается.

Мой код для показа рекламы:

public void loadAndShowInterstitialAd() {
        interstitial = new InterstitialAd(getApplicationContext());
        interstitial.setAdUnitId(AD_UNIT_ID);

        final AdRequest adRequest = new AdRequest.Builder()
                .build();

        Handler handler = new Handler(new Handler.Callback() {

            @Override
            public boolean handleMessage(Message msg) {
                interstitial.loadAd(adRequest);
                return true;
            }
        });

        if (handler != null) {
            handler.sendEmptyMessageDelayed(0, 200);
        }

        interstitial.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                super.onAdLoaded();
                displayInterstitial();
            }

        });
    }

    public void displayInterstitial() {
        if (interstitial.isLoaded()) {
            interstitial.show();
        }
    }

Я пробовал несколько решений в следующих вопросах переполнения стека, но у меня ничего не получалось.

Android Admob Внутренняя утечка памяти

Android AdMob вызывает утечку памяти?

2 ответа

Решение

Мне удалось решить эту проблему, запустив действие рекламы в другом процессе. Я думаю, по ряду причин, Android хранит действия в памяти процесса дольше, чем это необходимо. Надеюсь, это поможет кому-то решить эту проблему.

Я столкнулся с этой проблемой сегодня, наконец, у меня есть исправление: в вашей деятельности, в onDestroy():

  • Если есть AdView, удалите его из макета, установите для AdView значение null.
  • Установите все AdListeners в нуль.

     @Override 
      public void onDestroy(){
          super.onDestroy();
          mMainView.removeView(adView);
          adView = null;
          interstitial.setAdListener(null);
      }
    

    В вашем случае, возможно, достаточно установить AdListener в null.

P / S:

Поскольку утечки происходят по многим причинам, просто на случай, если кто-то пропустит это: не забудьте инициализировать Interstitial с помощью Context.getApplicationContext() (как то, что сделал OP), а не с помощью вашей Activity - которая абсолютно создает утечку - потому что Interstitial теперь, кажется, удерживает ссылка на вашу активность, и она никогда не уходит, поэтому никогда не позволяйте вашей активности идти...

Interstitial interstitial = new Interstitial(getApplicationContext())
Другие вопросы по тегам