AdMob Banner刷新时重复展示 如何清除旧Banner生成新广告
重复叠加的核心原因是刷新广告时没有对已加载的旧Banner实例做移除、销毁处理,直接创建新Banner实例添加到布局中,导致多个Banner视图在布局层堆叠。
核心处理规则
任何Banner刷新逻辑执行前,必须先完成旧Banner的完整清理流程,再初始化、加载新Banner,禁止跳过清理步骤直接创建新实例
1. 旧Banner标准清理实现
清理操作必须按顺序执行,不可跳步:
- 清空Banner实例绑定的所有监听回调,避免旧广告的异步回调触发异常逻辑
- 调用Banner的销毁方法,释放广告占用的内存资源
- 将Banner视图从父布局中彻底移除
- 把全局持有的Banner引用置空,避免内存泄漏
代码示例
Android Kotlin
// 全局持有Banner实例,禁止每次刷新直接新建局部实例 private var adBannerView: AdView? = null /** * 清理旧Banner资源,每次刷新前必须调用 */ private fun clearOldBanner() { adBannerView?.apply { adListener = null destroy() (parent as? ViewGroup)?.removeView(this) } adBannerView = null }
Android Java
// 全局持有Banner实例 private AdView adBannerView; private void clearOldBanner() { if (adBannerView != null) { adBannerView.setAdListener(null); adBannerView.destroy(); ViewGroup parentView = (ViewGroup) adBannerView.getParent(); if (parentView != null) { parentView.removeView(adBannerView); } adBannerView = null; } }
iOS Swift
// 全局持有Banner实例 private var bannerView: GADBannerView? private func clearOldBanner() { bannerView?.delegate = nil bannerView?.removeFromSuperview() bannerView = nil }
2. 正确的刷新调用顺序
每次触发Banner刷新必须严格遵循以下顺序:
- 调用
clearOldBanner()方法,完全清理旧Banner实例及关联资源 - 初始化新的Banner实例,配置广告单元ID、广告尺寸、根视图控制器等必填参数
- 将新创建的Banner视图添加到布局的指定位置
- 构建广告请求,调用
loadAd()方法加载新广告
注意:已经调用过
destroy()方法的Banner实例不可复用,必须重新创建新实例,否则会出现加载失败、内存泄漏问题。
常见错误写法避坑
- ❌ 不持有全局Banner引用,每次刷新直接创建新Banner添加到布局,完全不处理旧实例
- ❌ 仅调用
loadAd()尝试覆盖旧广告,不做移除、销毁操作 - ❌ 清理时仅将旧Banner设置为隐藏(
invisible/gone),不从父布局移除也不销毁资源,旧视图依然占用布局层级和内存 - ❌ 在广告加载成功/失败的回调中无防抖直接触发刷新,且未做前置清理,短时间内创建多个Banner实例导致堆叠
内容的提问来源于stack exchange,提问作者USHIO
相关产品推荐
相关产品推荐

