11

我的服务将在特定时间点显示一项活动,在每 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 导致内存泄漏?

4

2 回答 2

13

我今天遇到了这个问题,最后我有一个修复:在你的活动中,在 onDestroy() 中:

  • 如果有 AdView,请将其从布局中删除,将 AdView 设置为 null。
  • 将所有 AdListener 设置为 null。

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

    在您的情况下,可能将 AdListener 设置为 null 就足够了。

附言:

因为泄漏以多种方式发生,以防万一有人错过:记住使用 Context.getApplicationContext() 初始化 Interstitial(就像 OP 所做的那样),而不是通过您的 Activity - 这绝对会造成泄漏 - 因为 Interstitial 现在似乎持有对您的 Activity 的引用,它永远不会离开,所以永远不要让您的 Activity 离开......

Interstitial interstitial = new Interstitial(getApplicationContext())
于 2014-12-23T09:44:34.400 回答
1

我已通过在另一个进程中运行广告活动来解决此问题。我猜由于某些原因,android 将活动保留在进程内存中的时间超过了所需的时间。希望它能帮助某人解决这个问题。

于 2014-09-24T08:18:56.817 回答