我有一项服务,它会在特定的时间点显示一个活动,之后每13次我都会显示一个admob插播广告。当插播广告显示时,我的应用程序的RAM使用量增加了20MB,之后它就不会被垃圾收集了。在接下来的第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导致内存泄漏?
我今天跑到这个问题,最后我有一个修复:在你的activity中,在onDestroy()中:
- 如果有一个AdView,从你的布局中删除它,将AdView设置为null。
-
将所有AdListeners设置为null
@Override public void onDestroy(){ super.onDestroy(); mMainView.removeView(adView); adView = null; interstitial.setAdListener(null); }
在你的情况下,也许设置AdListener为null就足够了。
p/S:
因为泄漏发生在这么多的方式,只是以防有人错过这一点:记得使用Context.getApplicationContext()初始化Interstitial()(就像OP所做的),而不是你的活动-这绝对会造成泄漏-因为Interstitial现在似乎持有对你的活动的引用,它永远不会离开,所以永远不要让你的活动去…
Interstitial interstitial = new Interstitial(getApplicationContext())
我已经设法通过在另一个进程中运行广告活动来解决此问题。我猜由于某些原因,android在进程内存中保持活动的时间比需要的时间长。