Утечка памяти при использовании промежуточной рекламы 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();
}
}
Я пробовал несколько решений в следующих вопросах переполнения стека, но у меня ничего не получалось.
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())