我在应用程序中遇到了一些性能问题(UI呈现会暂时冻结),做了一些挖掘,发现PublisherAdView.loadAd()方法在冷应用程序启动时在Nexus 5上执行大约需要500-700ms,在后续运行时需要100-200ms .我预计最糟糕的是10-15ms.
为了验证这一点,我从这里下载了Banner示例: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使用网页浏览器,这在Android设备上效率极低,并且对CPU造成负担.最初的长加载时间是Android连接到Chromium插件以启动webview会话.一旦进入记忆,它将会改善.在列表/回收站视图中使用时最明显.
我使用的方法是在片段和活动中显示横幅.可以在广告服务器端配置刷新.我会避免在列表中插入广告(例如在每个第n个元素中插入广告),但如果必须,请使用view.setTag记录标记以指示广告已加载.
此标志实际上可以是广告加载的时间.然后在recyclerview的bindViewHolder中使用该标记,或在传统listView中使用getItem来确定广告是否已加载.如果广告已经加载,那么只显示当前内容/布局,否则如果它已经过期(通过某些任意时间量,如30秒),或者未设置该值,则发送loadAd请求),但之后再次打击表演.
因此,当用户滚动时,滚动性能会逐渐提高,因为每次实例化列表元素时都不会继续请求广告.此外,当使用片段时,如果片段特别是,如果片段在onDestroyView期间位于viewpager中,请确保您的广告是Publisher广告.