5

我有服务会在特定时间点显示活动,此后每隔13次在该活动中显示admob插页式广告。显示插页式广告时,我的应用程序的RAM使用量增加了20MB,之后未收集垃圾。在接下来的第13次显示另一个插页式广告时,服务内存不会增加。使用Admob插页式广告时发生内存泄露

我为显示广告代码:

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?

回答

2

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

+0

你有一个例子吗?我正在尝试一切已经有同样的问题,但无法找到它。你为此做了一个新班吗? – Riverside

+1

使用android:process属性来分隔要在不同进程中运行的活动。这解决了我的问题。适当地为您的项目使用它。 – venkat

+0

在另一个进程中运行并不能解决我的问题。 – frankish

6

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

  • 如果有AdView中,从布局中删除它,设置AdView的为空。
  • 将所有AdListeners设置为null。

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

    就你而言,也许将AdListener设置为null就足够了。

P/S:

由于泄漏发生在很多方面,以防万一有人错过这样的:记得初始化使用Context.getApplicationContext()的广告(像什么OP所做的那样),不是你的活动 - 这绝对创建一个泄漏 - 因为间质性现在似乎持有引用到你的活动,而且也从未离开,所以不要让你的活动去...

Interstitial interstitial = new Interstitial(getApplicationContext()) 
+0

尝试此操作,似乎解决了问题,因为不再有插页式广告从其发起的多个活动实例。 但是,有些东西还是不对的。如果放置过夜并加载广告,它仍会在某处存储内存。我认为这是一个谷歌sdk类,但也许错误仍然在应用程序的某个地方。 – Sojurn

+0

这不会阻止AdActivity对象泄漏。在展示每个插页式广告时,会有多个AdActivity副本... – frankish

+0

@frankish这就是AdMob在这个问题上的一面,我们对AdActivity没有任何控制权。我们的方法尽可能地努力,在我们拥有全部权力的一方,我们自己编写的每一项活动。你的问题怎么样,现在可以吗? – DuDu