You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AdMob Banner刷新时重复展示 如何清除旧Banner生成新广告

AdMob 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.04 16:18:27