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

Android端Rewarded ads激励广告加载异常无法按预期跳转问题求解

问题根因排查
  • 异步加载时序错误:RewardedAd.load() 是异步网络请求,你在点击按钮时同步调用loadAd()后立刻执行showAd()和广告非空判断,此时广告还没完成加载,mRewardedAd大概率为空,要么弹不出广告,要么如果之前缓存了旧广告就会直接跳过广告跳转。
  • 奖励回调逻辑错误:Kotlin代码里你在OnUserEarnedRewardListener中定义的onUserEarnedReward是本地嵌套函数,不会被系统自动调用,用户看完广告也触发不了你预期的后续逻辑。
  • 跳转逻辑位置错误:你把跳转到SecondActivity的逻辑写在了按钮点击的同步代码块里,根本没有等待用户完成广告观看,只要当时有缓存的广告实例就会直接跳转,完全不符合你的需求。
修复方案
  1. 提前预加载广告:在onCreate阶段就调用loadAd()预加载广告,不要等到用户点击按钮才开始加载,减少用户等待时间。
  2. 调整按钮点击逻辑:点击按钮时先判断广告是否加载完成,未完成则给用户提示,已完成则直接弹出广告。
  3. 修正奖励回调:将跳转逻辑移到奖励回调中,用户成功看完广告后再执行跳转。
  4. 广告用完后重新预加载:每次广告展示完成后,重新调用loadAd()缓存下一次要用的广告。
修复后的核心代码
class MainActivity : AppCompatActivity() {
    private val TAG = "MainActivityAd"
    private var btn1: Button? = null
    private var mRewardedAd: RewardedAd? = null
    // 标记用户点击了按钮,广告加载完成后自动弹出
    private var shouldShowAdAfterLoad = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btn1 = findViewById(R.id.button1)
        // 页面创建就预加载广告
        loadAd()

        btn1?.setOnClickListener {
            if (mRewardedAd != null) {
                showAd()
            } else {
                shouldShowAdAfterLoad = true
                Toast.makeText(this, "广告加载中,请稍候再试", Toast.LENGTH_SHORT).show()
            }
        }
    }

    private fun showAd() {
        mRewardedAd?.let { ad ->
            ad.show(this, OnUserEarnedRewardListener { rewardItem ->
                // 直接在回调里写逻辑,不要嵌套函数
                val rewardAmount = rewardItem.amount
                val rewardType = rewardItem.type
                Log.d(TAG, "User earned the reward.")
                Toast.makeText(this, "广告观看完成", Toast.LENGTH_SHORT).show()
                // 看完广告再跳转
                val intent = Intent(this, SecondActivity::class.java)
                startActivity(intent)
                // 用完广告重新预加载下一次的
                mRewardedAd = null
                loadAd()
            })
        } ?: run {
            Log.d(TAG, "The rewarded ad wasn't ready yet.")
            Toast.makeText(this, "广告还没准备好,请稍候再试", Toast.LENGTH_SHORT).show()
        }
    }

    private fun loadAd() {
        val adRequest = AdRequest.Builder().build()
        RewardedAd.load(
            this,
            "ca-app-pub-3940256099942544/5224354917",
            adRequest,
            object : RewardedAdLoadCallback() {
                override fun onAdFailedToLoad(adError: LoadAdError) {
                    Log.d(TAG, adError.message)
                    mRewardedAd = null
                    shouldShowAdAfterLoad = false
                }

                override fun onAdLoaded(rewardedAd: RewardedAd) {
                    Log.d(TAG, "Ad was loaded.")
                    mRewardedAd = rewardedAd
                    // 如果用户之前点了按钮,加载完成直接弹广告
                    if (shouldShowAdAfterLoad) {
                        shouldShowAdAfterLoad = false
                        showAd()
                    }
                }
            })
    }
}

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:01