【问题标题】:High ram usage with admobadmob 的高内存使用率
【发布时间】:2018-07-01 06:59:12
【问题描述】:

我正在尝试在我的应用中放置广告。根据 Admob Documentation 我必须初始化移动广告 SDK

MobileAds.initialize(this, "YOUR_ADMOB_APP_ID");

这会导致代码中的高内存使用率飙升。

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

此外,当从 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 事件。

这种行为对于 admob 是否正常?我该如何解决这个问题?

【问题讨论】:

  • 没什么异常
  • @AntonMalyshev 所以这种行为正常吗?
  • 是的,我想是的
  • 猜这是由于广告sdk使用了WebViews

标签: android memory-leaks garbage-collection admob google-admob


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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); 
    

    这里是link,它为此提供了完整的解决方案。

    希望对你有所帮助。

    【讨论】:

      【解决方案3】:

      我不知道这是否会有所帮助,但如果您关心 ram 的使用并且您在许多活动中使用广告,您可以从应用程序类启动 ad mob,这样广告只会初始化一次

      【讨论】:

        【解决方案4】:

        对于大多数设备,您的应用仍在可接受的 RAM 使用限制范围内。

        【讨论】:

          【解决方案5】:

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

          在 Android Studio 中检查泄漏

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

          【讨论】:

            猜你喜欢
            • 2011-09-19
            • 1970-01-01
            • 2012-05-31
            • 1970-01-01
            • 2011-03-31
            • 1970-01-01
            • 2016-07-07
            • 2012-07-02
            • 1970-01-01
            相关资源
            最近更新 更多