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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:09:01