已加载InterstitialAd但调用show时返回null问题求助
问题解决:InterstitialAd已加载但调用showAd时提示未加载
核心问题分析
- 错误的Activity实例引用:在RecyclerView的
onBindViewHolder中,通过MainActivity().showAd()创建了全新的MainActivity实例,而非引用当前正在运行、已完成广告加载的Activity实例。新实例的mInterstitialAd未被初始化加载,因此调用showAd时返回null。 - 广告回调设置时机错误:MainActivity中
fullScreenContentCallback的设置在loadAd()之后立即执行,但此时mInterstitialAd仍为null,?.操作不会生效,导致回调并未绑定到加载后的广告实例上。
解决方案
1. 修正Fragment中调用showAd的方式
方式一:直接获取当前Activity实例
在适配器的onBindViewHolder中,通过ItemView的上下文获取当前绑定的MainActivity:
override fun onBindViewHolder(holder: MyViewHolder, position: Int){ if(position % 20 == 0){ val mainActivity = holder.itemView.context as MainActivity mainActivity.showAd() } }
方式二:使用接口解耦(推荐)
通过定义接口实现Fragment/适配器与Activity的解耦,避免直接依赖MainActivity:
// 定义广告展示接口 interface AdShowable { fun showAd() } // MainActivity实现接口 class MainActivity : AppCompatActivity(), AdShowable { // ... 原有代码 ... override fun showAd() { // 原有实现逻辑 } } // 适配器通过接口调用 class MyAdapter(private val adShowable: AdShowable) : RecyclerView.Adapter<MyViewHolder>() { override fun onBindViewHolder(holder: MyViewHolder, position: Int){ if(position % 20 == 0){ adShowable.showAd() } } } // 在Fragment中初始化适配器时传入接口实例 val adapter = MyAdapter(requireActivity() as AdShowable)
2. 修正广告回调的设置时机
将fullScreenContentCallback的设置移到onAdLoaded方法中,确保回调绑定到已加载的广告实例:
private fun loadAd(){ InterstitialAd.load(this, "ca-app-pub-3940256099942544/1033173712", adRequest, object : InterstitialAdLoadCallback() { override fun onAdFailedToLoad(adError: LoadAdError) { Log.d(TAG, adError.toString()) mInterstitialAd = null } override fun onAdLoaded(interstitialAd: InterstitialAd) { Log.d(TAG, "Ad was loaded.") mInterstitialAd = interstitialAd // 绑定回调到已加载的广告实例 mInterstitialAd?.fullScreenContentCallback = object: FullScreenContentCallback() { override fun onAdClicked() { Log.d(TAG, "Ad was clicked.") } override fun onAdDismissedFullScreenContent() { Log.d(TAG, "Ad dismissed fullscreen content.") mInterstitialAd = null loadAd() // 广告关闭后自动加载下一个 } override fun onAdFailedToShowFullScreenContent(p0: AdError) { Log.e(TAG, "Ad failed to show fullscreen content.") mInterstitialAd = null } override fun onAdImpression() { Log.d(TAG, "Ad recorded an impression.") } override fun onAdShowedFullScreenContent() { Log.d(TAG, "Ad showed fullscreen content.") } } } }) }
同时移除onCreate中原来设置回调的代码,避免无效操作。
内容的提问来源于stack exchange,提问作者ApunichGULSHER
相关产品推荐
相关产品推荐

