Android端Rewarded ads激励广告加载异常无法按预期跳转问题求解
问题根因排查
- 异步加载时序错误:
RewardedAd.load()是异步网络请求,你在点击按钮时同步调用loadAd()后立刻执行showAd()和广告非空判断,此时广告还没完成加载,mRewardedAd大概率为空,要么弹不出广告,要么如果之前缓存了旧广告就会直接跳过广告跳转。 - 奖励回调逻辑错误:Kotlin代码里你在
OnUserEarnedRewardListener中定义的onUserEarnedReward是本地嵌套函数,不会被系统自动调用,用户看完广告也触发不了你预期的后续逻辑。 - 跳转逻辑位置错误:你把跳转到SecondActivity的逻辑写在了按钮点击的同步代码块里,根本没有等待用户完成广告观看,只要当时有缓存的广告实例就会直接跳转,完全不符合你的需求。
修复方案
- 提前预加载广告:在
onCreate阶段就调用loadAd()预加载广告,不要等到用户点击按钮才开始加载,减少用户等待时间。 - 调整按钮点击逻辑:点击按钮时先判断广告是否加载完成,未完成则给用户提示,已完成则直接弹出广告。
- 修正奖励回调:将跳转逻辑移到奖励回调中,用户成功看完广告后再执行跳转。
- 广告用完后重新预加载:每次广告展示完成后,重新调用
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
相关产品推荐
相关产品推荐

