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
相关产品推荐
相关产品推荐

