高内存使用率与admob相关

6
我正在尝试在我的应用程序中放置广告。根据Admob的文档,我需要初始化Mobile Ads SDK。
MobileAds.initialize(this, "YOUR_ADMOB_APP_ID");

这会导致代码中高内存使用率的激增。

enter image description here

但如果我删除这行代码,内存使用量就会下降,并且这行代码似乎对应用内的广告服务没有任何影响。

enter image description here

当从AdMob请求广告时,内存使用率再次飙升,并在应用程序启动时引起3-4个GC事件。我认为这是内存泄漏。
以下是我在onCreate方法中请求广告的方式。
AdRequest request = null;
        if (BuildConfig.DEBUG) {
            //Facebook Audience Network
            List<String> testDeviceId = new ArrayList<>();
            testDeviceId.add("TESTID");//Redmi Note 3
            testDeviceId.add("TESTID");//Moto G 1st Gen

            AdSettings.addTestDevices(testDeviceId);

            //Google Ad-mob
            request = new AdRequest.Builder()
                    .addTestDevice("TESTID")//Redmi Note 3
                    .addTestDevice("TESTID")//Mot G 1st Gen
                    .build();
        } else {
            request = new AdRequest.Builder()
                    .build();
        }

        AdView mAdView = findViewById(R.id.adView);
        mAdView.loadAd(request);

加载此横幅广告时会触发多个GC事件。如果不加载广告,则永远不会触发GC事件。

enter image description here

这种行为在Admob中正常吗?我该如何解决?

2
没有什么异常 - Anton Malyshev
@AntonMalyshev 这种行为是正常的吗? - Skyyy
是的,我认为是这样。 - Anton Malyshev
猜测这是由广告SDK使用的“WebViews”引起的。 - Debdeep
6个回答

1

Google AdView有许多动画的WebView。它会使所有移动CPU变热。AdView占用30%的CPU。

解决方案:您还可以添加自定义监听器,以便在一段时间后销毁并重新创建,以更好地处理它。服务器端还有一个参数告诉应用程序广告何时应该请求新广告,我不确定它是否存在于所有情况下,但对于DFP账户来说是存在的。
这是我建议的最简单的方法

new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
  if (!isBeingDestroyed) {
      final AdRequest adRequest = new AdRequest();
      final AdView adView = (AdView) findViewById(R.id.ad);
      adView.loadAd(adRequest);
  }
}).sendEmptyMessageDelayed(0, 1000); 

这里是提供完整解决方案的链接
希望它能帮到你。

0

你说得完全正确。MobileAds.initilize() 可以被移除,应用程序仍然可以工作,但是当你请求第一次加载广告时,initilize() 方法将在后台被调用。 我建议你尽快调用这个方法。例如,在你的 Application 类中。另外,从 Admob 21.0.0 版本开始,你可以优化初始化过程。只需在你的清单文件中添加以下行:

 <meta-data
        android:name="com.google.android.gms.ads.flag.OPTIMIZE_INITIALIZATION"
        android:value="true"/>
    <meta-data
        android:name="com.google.android.gms.ads.flag.OPTIMIZE_AD_LOADING"
        android:value="true"/>

0

是的,这种行为是正常的。AdView是一个动态WebView,消耗大约50MB的RAM。大多数内存泄漏发生在您旋转屏幕并且先前Activity的实例附加到像监听器或线程之类的元素时。以下是一些示例。要检查您的应用程序是否泄漏,您可以使用LeakCanary或Android Studio。

在Android Studio中检查泄漏

  1. 启动内存分析器
  2. 选择内存和“转储Java堆”
  3. 将文件导出为.hprof文件
  4. 将.hprof文件拖到Android Studio中,并查找分析器任务并按下运行按钮以检查您的活动是否泄漏。

0

你的应用程序在大多数设备上的RAM使用量仍然在可接受的范围内。


0
你可以在AndroidManifest.xml文件中添加android:largeHeap="true",这样你的用户就不会受到影响。

-1

我不知道这是否有帮助,但如果您关心内存使用并且在许多活动中使用广告,您可以从应用程序类启动广告模块,这样广告将只初始化一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接