Android 使用Admob间隙式ads时内存泄漏

Android 使用Admob间隙式ads时内存泄漏,android,memory,android-activity,memory-leaks,eclipse-memory-analyzer,Android,Memory,Android Activity,Memory Leaks,Eclipse Memory Analyzer,我的服务将在特定的时间点显示一个活动,在该活动之后,每13次我显示一个admob间隙广告。当间隙广告显示时,我的应用程序的RAM使用量将增加20MB,此后不会被垃圾收集。在接下来的第13次显示另一个插入式广告时,服务内存没有增加 我显示广告的代码: public void loadAndShowInterstitialAd() { interstitial = new InterstitialAd(getApplicationContext()); interst

我的服务将在特定的时间点显示一个活动,在该活动之后,每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();
        }
    }
在下面的堆栈溢出问题中,我尝试了一些解决方案,但没有任何效果


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

我今天运行了此问题,终于找到了解决方法: 在您的活动中,在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()初始化Interstival(就像OP所做的那样),而不是通过您的活动(这绝对会造成泄漏),因为Interstival现在似乎持有对您的活动的引用,而且它永远不会离开,所以永远不要让你的活动消失

Interstitial interstitial = new Interstitial(getApplicationContext())

你有一个例子吗?我已经用同样的问题试过了,但是找不到。您是否为此创建了一个新类?使用android:process属性来分隔要在不同进程中运行的活动。这解决了我的问题。在eclipse中使用DDMS视图来分析内存泄漏的对象。它可能会为您的问题提供一些线索。尝试这样做,似乎可以解决问题,因为Interstival启动的活动不再有多个实例。然而,有些事情仍然不对。如果让它整夜坐着看广告,它仍然会在某处积累记忆。我认为这是一个GoogleSDK类,但可能故障仍然存在于应用程序的某个地方。这并不能防止AdActivity对象泄漏。将有多个ADACTIVE副本,每个间隙显示…@frankish这是AdMob在这个问题上的立场,我们对ADACTIVE没有任何控制。我的方法是尽我们最大的努力,在我们这一方,我们有充分的权力,我们自己的书面活动。你的问题怎么样,现在可以了吗?将Interstitual的上下文设置为app context可以让GC删除我的MainActivity。然而,知道所有的广告内容仍在内存中,并且它会不断增长,这确实让我感到困扰:|
getApplicationContext()
技巧对我来说很有用。