Kotlin实现预加载AdMob插屏广告跨Activity调用报错求助
解决方案
不要尝试通过Intent传递插屏广告实例,AdMob的广告对象本身不支持Parcelable/Serializable序列化,这是Java转Kotlin实现该需求最常见的报错原因。正确的预加载+跨页面调用实现如下:
步骤1:在MainActivity中实现预加载逻辑
通过伴生对象全局持有已加载的插屏广告实例:
class MainActivity : AppCompatActivity() { companion object { // 全局存储预加载完成的插屏广告 var preloadedInterstitialAd: InterstitialAd? = null } private lateinit var adRequest: AdRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化广告请求 adRequest = AdRequest.Builder().build() // 启动预加载 loadInterstitialAd() } private fun loadInterstitialAd() { InterstitialAd.load(this, "替换为你的AdMob插屏广告单元ID", adRequest, object : InterstitialAdLoadCallback() { override fun onAdLoaded(interstitialAd: InterstitialAd) { preloadedInterstitialAd = interstitialAd // 配置广告展示回调,用完自动置空避免内存泄漏 preloadedInterstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() { override fun onAdDismissedFullScreenContent() { preloadedInterstitialAd = null // 可选:广告关闭后自动预加载下一次 loadInterstitialAd() } override fun onAdFailedToShowFullScreenContent(adError: AdError) { preloadedInterstitialAd = null } } } override fun onAdFailedToLoad(loadAdError: LoadAdError) { preloadedInterstitialAd = null } }) } }
步骤2:其他Activity调用预加载广告
调用前严格判空适配Kotlin空安全规则:
class OtherActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_other) // 需要展示广告的位置调用 findViewById<Button>(R.id.btn_show_ad).setOnClickListener { MainActivity.preloadedInterstitialAd?.let { ad -> ad.show(this) } ?: run { // 广告未加载完成的兜底逻辑,可直接执行业务逻辑或提示用户 Toast.makeText(this, "广告加载中,请稍后再试", Toast.LENGTH_SHORT).show() } } } }
常见转Kotlin报错修复点
- Kotlin空安全检查比Java严格,所有调用广告实例的位置必须判空,否则会触发编译错误
- 新版AdMob已废弃
InterstitialAd(context)构造方法,必须使用静态InterstitialAd.load方法加载,否则会触发方法找不到错误 - 自动转换Java的匿名接口实现时,需要检查SAM转换是否正确,避免接口方法签名匹配错误
内容的提问来源于stack exchange,提问作者Viks Viks
相关产品推荐
相关产品推荐

