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

按钮计数器达指定次数时插屏广告不显示,如何修复?

插屏广告无法触发的问题排查与修复

核心问题分析

  1. 单实例复用冲突:两个不同触发逻辑的插屏广告共用同一个mInterstitialAd对象,加载第二个广告时会直接覆盖第一个的实例,导致其中一个触发条件满足时,实际持有的是错误的广告实例(或为空),无法正常展示。
  2. 缺少预加载逻辑:仅在广告关闭后才加载新广告,初始化阶段未预先加载两个插屏广告,用户点击达到阈值时,广告可能还未完成加载(mInterstitialAd为null),触发条件不成立。
  3. 计数器重置不严谨:只有广告成功展示并关闭后才重置计数器,若广告未加载完成,计数器会持续累加,后续即使广告加载完成,也可能错过触发时机。
  4. 无错误排查日志:广告加载失败时仅将变量置空,未打印错误信息,无法定位加载失败的具体原因(如广告ID异常、网络问题、SDK版本兼容问题)。

修复方案

1. 为两个广告定义独立实例

创建两个InterstitialAd变量,避免互相覆盖:

private InterstitialAd mInterstitialAdNav; // 对应next按钮的广告
private InterstitialAd mInterstitialAdCopy; // 对应copy按钮的广告

2. 初始化阶段预加载广告

在onCreate中提前加载两个广告,确保用户操作前广告已准备就绪:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_activity);
    
    // 初始化广告SDK
    MobileAds.initialize(this, initializationStatus -> {});
    
    // 横幅广告原有逻辑保留
    AdView mAdView = findViewById(R.id.adView);
    AdRequest adRequest = new AdRequest.Builder().build();
    mAdView.loadAd(adRequest);
    mAdView.setAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(@NotNull LoadAdError adError) {
            super.onAdFailedToLoad(adError);
            mAdView.loadAd(adRequest);
        }
    });
    
    // 预加载两个插屏广告
    loadInterstitialAdNav();
    loadInterstitialAdCopy();
}

3. 分离广告加载与展示逻辑

为每个广告编写独立的加载、展示方法,避免逻辑混淆:

// 加载next按钮对应的插屏广告
private void loadInterstitialAdNav() {
    AdRequest adRequest = new AdRequest.Builder().build();
    InterstitialAd.load(this, "ca-app-pub-3940256099942544/1033173712", adRequest,
            new InterstitialAdLoadCallback() {
                @Override
                public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                    mInterstitialAdNav = interstitialAd;
                }

                @Override
                public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                    mInterstitialAdNav = null;
                    // 打印错误日志方便排查
                    Log.e("AdError", "Nav广告加载失败: " + loadAdError.getMessage());
                }
            });
}

// 加载copy按钮对应的插屏广告
private void loadInterstitialAdCopy() {
    AdRequest adRequest = new AdRequest.Builder().build();
    InterstitialAd.load(this, "ca-app-pub-3940256099942544/8691691433", adRequest,
            new InterstitialAdLoadCallback() {
                @Override
                public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                    mInterstitialAdCopy = interstitialAd;
                }

                @Override
                public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                    mInterstitialAdCopy = null;
                    Log.e("AdError", "Copy广告加载失败: " + loadAdError.getMessage());
                }
            });
}

4. 修正触发与计数器逻辑

确保点击阈值判断使用对应广告实例,且无论广告展示成功与否,都合理重置计数器:

@SuppressLint("SetTextI18n")
private void next() {
    countClicksNext++;
    position = (position + 1) % quotes_list.size();
    quotesTxt.setText(quotes_list.get(position));
    countTxt.setText(position + "/" + quotes_list.size());
    
    if (mInterstitialAdNav != null && countClicksNext >= triggerClicksNav) {
        showNavAd();
    }
}

private void copy() {
    countClicksCopy++;
    ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clipData = ClipData.newPlainText("text", quotesTxt.getText());
    if (clipboardManager != null) {
        clipboardManager.setPrimaryClip(clipData);
    }
    Toast.makeText(getApplicationContext(), "Copied", Toast.LENGTH_SHORT).show();
    
    if (mInterstitialAdCopy != null && countClicksCopy >= triggerClicks) {
        showCopyAd();
    }
}

// 展示next按钮对应的广告
private void showNavAd() {
    mInterstitialAdNav.show(HomeActivity.this);
    mInterstitialAdNav.setFullScreenContentCallback(new FullScreenContentCallback() {
        @Override
        public void onAdDismissedFullScreenContent() {
            super.onAdDismissedFullScreenContent();
            mInterstitialAdNav = null;
            loadInterstitialAdNav();
            countClicksNext = 0;
        }

        @Override
        public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
            super.onAdFailedToShowFullScreenContent(adError);
            mInterstitialAdNav = null;
            loadInterstitialAdNav();
            countClicksNext = 0;
        }
    });
}

// 展示copy按钮对应的广告
private void showCopyAd() {
    mInterstitialAdCopy.show(HomeActivity.this);
    mInterstitialAdCopy.setFullScreenContentCallback(new FullScreenContentCallback() {
        @Override
        public void onAdDismissedFullScreenContent() {
            super.onAdDismissedFullScreenContent();
            mInterstitialAdCopy = null;
            loadInterstitialAdCopy();
            countClicksCopy = 0;
        }

        @Override
        public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
            super.onAdFailedToShowFullScreenContent(adError);
            mInterstitialAdCopy = null;
            loadInterstitialAdCopy();
            countClicksCopy = 0;
        }
    });
}

5. 额外建议

  • 检查AdMob SDK版本是否为最新,搁置项目期间SDK可能有更新,旧版本存在兼容性风险。
  • 确保测试设备符合AdMob测试要求(当前使用的是测试ID,此部分无问题),避免真实广告填充问题导致无法展示。
  • 添加计数器数值和广告状态的日志打印,方便调试跟踪。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:36:20