使用Admob插页式广告时内存泄漏



我有一项服务,它会在特定的时间点显示一个活动,之后每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在进程内存中保持活动的时间比需要的时间长。

最新更新