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

已加载InterstitialAd但调用show时返回null问题求助

问题解决:InterstitialAd已加载但调用showAd时提示未加载

核心问题分析

  1. 错误的Activity实例引用:在RecyclerView的onBindViewHolder中,通过MainActivity().showAd()创建了全新的MainActivity实例,而非引用当前正在运行、已完成广告加载的Activity实例。新实例的mInterstitialAd未被初始化加载,因此调用showAd时返回null。
  2. 广告回调设置时机错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:15:35