Jetpack Compose加载页面前展示AdMob插屏广告不生效问题
问题原因
插屏广告的loadInterstitial是异步操作,调用后需要从网络拉取广告资源,不会立刻返回可用的广告实例。你在LaunchedEffect中调用完加载方法后立刻执行showInterstitial,此时广告还未加载完成,自然无法正常弹出。
按钮点击场景能正常运行属于巧合:用户进入页面到点击按钮之间存在时间差,刚好够广告完成加载,本身直接连续调用load和show的写法是不规范的。
修复方案
步骤1:给广告加载方法增加结果回调
修改AdMob中的loadInterstitial方法,增加加载成功、加载失败的回调参数,在广告加载完成的系统回调里触发自定义回调:
fun loadInterstitial( context: Context, onAdLoaded: () -> Unit = {}, onAdFailed: (LoadAdError) -> Unit = {} ) { val adRequest = AdRequest.Builder().build() InterstitialAd.load(context, AD_UNIT_ID, adRequest, object : InterstitialAdLoadCallback() { override fun onAdLoaded(interstitialAd: InterstitialAd) { // 保存加载完成的广告实例 mInterstitialAd = interstitialAd onAdLoaded() } override fun onAdFailedToLoad(loadAdError: LoadAdError) { mInterstitialAd = null onAdFailed(loadAdError) } }) }
步骤2:仅在广告加载完成后调用展示逻辑
调整Composable初始化时的广告调用逻辑,只在加载成功的回调里执行展示操作:
LaunchedEffect(Unit) { loadInterstitial( context = context, onAdLoaded = { // 额外加一层非空判断,避免极端情况异常 if (mInterstitialAd != null) { showInterstitial(context) } }, onAdFailed = { error -> Log.d("MainActivity", "广告加载失败:${error.message}") } ) Log.d("MainActivity", "Interstitial loaded on composable") }
额外注意事项
- 调用
showInterstitial前必须判断广告实例是否存在,避免空指针崩溃 - 不要在Composable频繁重组的场景下重复触发广告加载,当前
LaunchedEffect(Unit)的写法可以保证仅初始化时调用一次,符合要求 - 测试阶段优先使用官方提供的测试广告ID,避免因账号风控、填充不足导致的展示失败
内容的提问来源于stack exchange,提问作者Raw Hasan
相关产品推荐
相关产品推荐

