开屏跳转后插屏广告(Interstitial ads)展示频次偏低问题排查求助
问题根因分析
- 回调注册顺序错误:SplashActivity中先调用
Ads.preload(),该方法第一行就将adsCallback置为null,之后才调用setAdsCallBack()注册回调。如果广告加载速度快,在回调注册完成前就加载结束,adsLoaded()回调不会触发,isAdsOpen无法被置为true,只能等待8s超时才跳转主页面,此时广告大概率已失效或未加载完成,无法展示。 - 广告重试计数无重置逻辑:
requestInterAdCount是单例全局变量,仅在加载失败时累加,没有在每次调用preload()时重置的逻辑。只要某次加载重试达到2次上限,后续所有的预加载请求都不会再触发重试,直接加载失败。 - 状态变量语义错误:
mAdIsLoading命名为「广告加载中」,但实际在广告加载成功后才被置为true,加载失败时永远保持初始值false。如果广告加载失败,即使后续有新的广告加载完成,也可能因为状态异常无法触发展示。 - 超时跳转后无兜底展示逻辑:8s超时跳转主页面时,若广告仍在加载中,主页面
onCreate调用showInter()时会直接判断无可用广告,不会等待加载完成后再展示,直接错过本次展示机会。 - 单例广告缓存未做有效性校验:全局缓存的
mInterstitialAd没有过期校验逻辑,上一次启动残留的过期广告会占用缓存,导致新的广告无法加载,调用show时直接失败。
修复方案
- 调整回调注册顺序:SplashActivity中先调用
setAdsCallBack()注册回调,再调用preload()预加载广告,避免回调丢失。
// 修正SplashActivity onCreate中的调用顺序 Ads.setAdsCallBack(this) Ads.preload(this, BuildConfig.ADS_INTERSTITIAL)
- 预加载时重置重试计数和状态:修改
preload()方法,每次预加载时重置重试计数、旧的广告缓存和状态变量。
fun preload(context: Context, adsId: String) { // 先重置所有状态 requestInterAdCount = 0 mInterstitialAd = null mAdIsLoading = false loadAd(context, adsId) }
- 修正状态变量逻辑:将
mAdIsLoading重命名为mInterstitialAdReady,明确语义为广告已就绪可展示,加载开始时标记为加载中,加载成功标记为就绪,加载失败/展示结束标记为未就绪。 - 增加广告加载完成后自动展示逻辑:主页面调用
showInter()时如果广告还在加载中,可临时注册回调,等广告加载完成后自动触发展示,避免错过展示窗口。 - 增加广告有效性判断:调用
showInter()时除了判断缓存是否为空,还可以增加加载时间校验,超过2小时的广告直接判定为过期,清空缓存后重新加载。
内容的提问来源于stack exchange,提问作者Binary
相关产品推荐
相关产品推荐

