我有一个应用程序的一些性能问题(UI 渲染会卡住片刻),做了一些挖掘,发现 PublisherAdView.loadAd() 方法在冷应用程序启动时在 Nexus 5 上执行大约需要 500-700 毫秒,在后续运行时需要 100-200 毫秒.我预计最坏的情况是 10-15 毫秒。
为了验证这一点,我从这里下载了横幅示例:https://developers.google.com/mobile-ads-sdk/docs/dfp/android/banner 并修改了 MainActivity 以在单独的方法中执行 loadAd() 方法:
private PublisherAdView mAdView;
private PublisherAdRequest adRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
mAdView = (PublisherAdView) findViewById(R.id.ad_view);
adRequest = new PublisherAdRequest.Builder().build();
loadAd();
}
private void loadAd(){
long start = System.currentTimeMillis();
// Start loading the ad in the background.
mAdView.loadAd(adRequest);
long end = System.currentTimeMillis();
Log.d("MyActivity", "loadAd took "+(end - start)+" ms");
}
当同时显示更多广告(文章开头的横幅,介绍下方的矩形广告...)并且 UI 卡住半秒甚至更长时间,直到它们被加载时,问题变得更加明显。
这也是在 RecyclerView 中显示广告时出现的问题,并且在滚动期间 UI 卡住,直到加载广告。
我在这里遗漏了什么,或者这确实是 PublisherAdView 问题?
最佳答案
我有类似的经历,adMob 在后台使用 webviews,这在 Android 设备上效率极低并且对 CPU 造成负担。最初的长加载时间是 Android 连接到 Chromium 插件以启动 webview session 。一旦进入内存,它就会有所改善。在列表/回收器 View 中使用时最引人注目。
我使用的方法是在 fragment 和 Activity 中显示一次横幅。刷新可在广告服务器端进行配置。我会避免在列表中插入广告(例如在每个第 n 个元素中插入一个广告),但如果必须,请使用 view.setTag 记录一个标志以指示广告已加载。
这个标志实际上可以是广告加载的时间。然后在回收 View 的 bindViewHolder 中使用该标签,或在传统的 listView 中使用 getItem 来确定广告是否已加载。如果广告已加载,则只显示当前内容/布局,否则如果它已过期(通过任意时间,如 30 秒),或未设置该值,则发送 loadAd 请求),但随后您再次受到性能冲击。
因此,当用户滚动时,滚动性能会逐渐提高,因为您不会在每次列表元素实例化时都继续请求广告。此外,在使用 Fragments 时,请确保您使用 PublisherAdView.pause() 您的广告,特别是如果它在 onDestroyView 期间位于 viewpager 中。
关于android - Android 上的 PublisherAdView loadAd 性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37851878/