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

AdMob插屏广告(Interstitial Ads)无法显示问题求助

问题排查与解决方案

核心问题是插屏广告的加载是异步操作,你调用loadInterstatialAd()后立刻获取返回值,此时广告还未完成加载,所以mInterstitialAd必然为null。以下是具体修复步骤:

1. 为AdsManager添加回调接口

通过回调通知广告加载状态,避免异步操作导致的空指针问题:

public class AdsManager {
    private Context context;
    private InterstitialAd mInterstitialAd;
    private OnAdLoadListener adLoadListener;

    // 定义回调接口,通知广告加载结果
    public interface OnAdLoadListener {
        void onAdLoaded(InterstitialAd interstitialAd);
        void onAdLoadFailed(LoadAdError error);
    }

    public AdsManager(Context context, OnAdLoadListener adLoadListener) {
        this.context = context;
        this.adLoadListener = adLoadListener;
        MobileAds.initialize(context, initializationStatus -> {
            // 初始化完成后直接预加载广告
            loadInterstitialAd();
        });
    }

    public void createAds(AdView adView) {
        AdRequest adRequest = new AdRequest.Builder().build();
        adView.loadAd(adRequest);
    }

    public void loadInterstitialAd() {
        AdRequest adRequest = new AdRequest.Builder().build();

        InterstitialAd.load(context, "ca-app-pub-3940256099942544/1033173712",
                adRequest, new InterstitialAdLoadCallback() {
                    @Override
                    public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                        super.onAdFailedToLoad(loadAdError);
                        mInterstitialAd = null;
                        Log.d("InterstitsionalAds", "Load Error: " + loadAdError);
                        if (adLoadListener != null) {
                            adLoadListener.onAdLoadFailed(loadAdError);
                        }
                    }

                    @Override
                    public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                        super.onAdLoaded(interstitialAd);
                        mInterstitialAd = interstitialAd;
                        mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                            @Override
                            public void onAdDismissedFullScreenContent() {
                                super.onAdDismissedFullScreenContent();
                                // 广告关闭后预加载下一条,保证下次能快速显示
                                loadInterstitialAd();
                            }

                            @Override
                            public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                                super.onAdFailedToShowFullScreenContent(adError);
                                Log.d("InterstitsionalAds", "Show Error: " + adError);
                                mInterstitialAd = null;
                            }

                            @Override
                            public void onAdShowedFullScreenContent() {
                                super.onAdShowedFullScreenContent();
                                mInterstitialAd = null;
                            }
                        });
                        if (adLoadListener != null) {
                            adLoadListener.onAdLoaded(interstitialAd);
                        }
                    }
                });
    }

    // 获取已加载的广告实例
    public InterstitialAd getLoadedInterstitialAd() {
        return mInterstitialAd;
    }
}

2. 修改Activity中的调用逻辑

在Activity中实现回调接口,等待广告加载完成后再触发显示:

public class ColoringActivity extends AppCompatActivity implements AdsManager.OnAdLoadListener {
    private AdsManager adsManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_coloring);
        
        // 初始化AdsManager并传入回调
        adsManager = new AdsManager(this, this);
    }

    // 在需要显示广告的时机调用此方法(比如按钮点击、页面切换)
    private void triggerInterstitialAd() {
        InterstitialAd ad = adsManager.getLoadedInterstitialAd();
        if (ad != null) {
            ad.show(this);
        } else {
            // 广告未加载完成,触发重新加载
            adsManager.loadInterstitialAd();
        }
    }

    @Override
    public void onAdLoaded(InterstitialAd interstitialAd) {
        // 广告加载完成,可以选择自动显示,或等待合适时机调用triggerInterstitialAd()
        // triggerInterstitialAd();
    }

    @Override
    public void onAdLoadFailed(LoadAdError error) {
        // 处理加载失败逻辑,比如记录日志或提示用户
    }
}

额外注意事项

  • 提前预加载:建议在App启动或进入目标页面时就加载广告,不要等到需要显示时才触发加载,提升广告展示成功率。
  • 状态管理:广告显示后需将mInterstitialAd置为null,避免重复显示;广告关闭后及时预加载下一条,保证后续展示流畅。
  • 拼写修正:你的代码中loadInterstatialAd存在拼写错误,正确应为loadInterstitialAd(缺少字母t),建议修正以保证代码规范性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:15:35