【问题标题】:Memory Leak while using Admob interstitial ads使用 Admob 插页式广告时出现内存泄漏
【发布时间】:2014-07-23 05:52:29
【问题描述】:

我的服务会在特定时间点显示一个活动,在该活动之后每 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 Interstitial Memory leak

Android AdMob causes memory leak?

【问题讨论】:

    标签: android memory android-activity memory-leaks eclipse-memory-analyzer


    【解决方案1】:

    我今天遇到了这个问题,终于解决了: 在您的活动中,在 onDestroy() 中:

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

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

      在你的情况下,也许将 AdListener 设置为 null 就足够了。

    P/S:

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

    Interstitial interstitial = new Interstitial(getApplicationContext())
    

    【讨论】:

    • 尝试这个,似乎解决了问题,因为插页式广告的启动活动不再有多个实例。然而,还是有些不对劲。如果一夜之间坐下来加载广告,它仍然会在某处积累内存。我认为这是一个 google sdk 类,但也许故障仍然在某个应用程序中。
    • 这并不能防止 AdActivity 对象泄漏。将显示多个 AdActivity 副本,每个插页式广告都显示...
    • @frankish 这是 AdMob 的问题所在,我们无法控制 AdActivity。我的方法是尽我们所能在我们拥有全部力量的地方努力,我们自己编写的每一项活动。你的问题呢,现在可以了吗?
    • 将 Interstitial 的上下文设置为应用上下文可以让 GC 删除我的 MainActivity。然而,我知道所有的广告内容都还在记忆中,而且还在不断增长,这真的让我很困扰:|
    • getApplicationContext() 提示对我有用。
    【解决方案2】:

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

    【讨论】:

    • 你有例子吗?我正在尝试所有相同的问题,但找不到。您为此开设了新课程吗?
    • 使用 android:process 属性将活动分开以在不同的进程中运行。这解决了我的问题。为您的项目适当地使用它。
    • 在eclipse中使用DDMS视图分析内存泄露的对象。它可能会为您的问题提供一些线索。
    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多