我正在尝试在我的应用中放置广告。根据Admob Documentation,我必须初始化移动广告SDK
onCreate
这导致代码中高ram使用率的高峰。
但如果我删除此行,则ram使用率下降&这行代码似乎对应用内的广告服务没有任何影响。
此外,当从admob ram使用请求广告再次加剧并在应用启动时导致3-4个GC事件。我相信这是内存泄漏。
以下是我在
中请求广告的方式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);
方法
{{1}}
加载此横幅广告时,会启动多个GC活动。如果我不加载广告,则GC事件从未被踢过。
这种行为与admob一样正常吗?我怎么解决这个问题?
答案 0 :(得分:1)
Google AdView内置了大量动画的WebView。它会加热所有移动CPU。 AdView占用CPU的30%。
解决方案:您还可以在一段时间后添加自定义侦听器以进行销毁,然后重新创建以便更好地处理它。 Serverside还有一个参数告诉应用广告应该多久要求新广告,我不确定它是否存在于所有情况下,但它适用于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。
希望它会对你有所帮助。
答案 1 :(得分:0)
是的,这种行为是正常的。 AdView是一个动态WebView,消耗大约50mb RAM。当您旋转屏幕并且先前Activity的实例附加到侦听器或线程等元素时,会发生大多数内存泄漏。这里有一些examples。要检查您的应用是否泄露,您可以使用LeakCanary或Android Studio。
检查Android Studio中的泄漏
答案 2 :(得分:0)
您的应用仍处于大多数设备可接受的RAM使用限制范围内。
答案 3 :(得分:0)
查看Google网上论坛上有关Admob高Ram使用情况的High Memory Usage - AdMob on Android (55 MB)
答案 4 :(得分:0)
您可以将android:largeHeap="true"
放入AndroidManifest.xml文件中,这样您的用户就不会受到影响。
答案 5 :(得分:-1)
我不知道这是否会有所帮助,但是如果你关心ram的使用并且你在许多活动中使用广告,你可以从应用程序类开始广告,那么广告只会初始化一次