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

Android中Facebook插屏广告每7次滑动仅显示一次的问题排查

解决Facebook插屏广告仅显示一次的问题

嗨,我来帮你排查下这个插屏广告的问题~ 先梳理下你代码里的核心问题,再一步步给出修改方案:

问题根源

  1. 滑动计数变量没正确维护:你注释掉的final int counter = 0是final修饰的局部变量,不仅没法修改,每次方法执行还会重置,完全起不到累计计数的作用。
  2. 插屏广告仅加载一次:当前代码只在onCreate里调用了一次interstitialAd.loadAd(),广告展示后没有重新加载新的广告,导致后续触发时没有可用广告。
  3. 页面切换监听逻辑不完整:你贴的代码里OnPageChangeListener没写完,缺少滑动计数和广告触发的核心逻辑。

具体修改方案

步骤1:添加正确的滑动计数成员变量

在MainActivity类里添加一个成员变量来记录滑动次数,不要用final修饰:

public class MainActivity extends AppCompatActivity {
    // ... 其他已有的成员变量
    private int slideCounter = 0; // 用于累计ViewPager滑动次数
    // ...
}

步骤2:完善页面切换监听逻辑

完整实现ViewPager.OnPageChangeListener,每次页面切换时累计次数,达到7次就触发广告,同时处理广告展示后的重新加载:

private final ViewPager.OnPageChangeListener mOnPageChangeListener = new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // 此方法无需处理
    }

    @Override
    public void onPageSelected(int position) {
        // 每次切换页面,计数+1
        slideCounter++;
        // 保留你原来的分享意图更新逻辑
        setShareIntent(position);
        
        // 检查是否达到7次滑动触发条件
        if (slideCounter >= 7) {
            // 先判断广告是否已加载完成
            if (interstitialAd != null && interstitialAd.isAdLoaded()) {
                interstitialAd.show();
                // 展示后重置计数
                slideCounter = 0;
                // 立即加载下一条广告,保证下次触发时有可用广告
                interstitialAd.loadAd();
            } else {
                // 广告未加载成功也重置计数,避免一直累计
                slideCounter = 0;
                // 尝试重新加载广告
                if (interstitialAd != null) {
                    interstitialAd.loadAd();
                }
            }
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        // 此方法无需处理
    }
};

步骤3:优化广告生命周期,避免内存泄漏

在Activity销毁时销毁广告资源,防止内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (adView != null) {
        adView.destroy();
    }
    if (interstitialAd != null) {
        interstitialAd.destroy();
    }
}

可选:添加广告加载回调(方便调试)

给插屏广告添加加载回调,能直观看到广告加载状态,也能在广告关闭后自动加载新广告:

// 在onCreate初始化插屏广告时添加
interstitialAd.setAdListener(new InterstitialAdListener() {
    @Override
    public void onAdLoaded(Ad ad) {
        // 广告加载成功的提示(可选)
        Log.d("FBAd", "插屏广告加载完成");
    }

    @Override
    public void onAdFailed(Ad ad, AdError adError) {
        // 打印加载失败原因,方便排查问题
        Log.e("FBAd", "插屏广告加载失败: " + adError.getErrorMessage());
    }

    @Override
    public void onInterstitialDismissed(Ad ad) {
        // 广告关闭后立即加载下一条,确保后续触发时有广告可用
        interstitialAd.loadAd();
    }

    // 其他回调方法按需实现即可
    @Override public void onAdClicked(Ad ad) {}
    @Override public void onAdImpression(Ad ad) {}
    @Override public void onInterstitialDisplayed(Ad ad) {}
});
interstitialAd.loadAd();

这样修改后,每次ViewPager滑动都会累计次数,达到7次时如果广告已加载就会展示,展示后重置计数并自动加载新广告,就能实现你想要的“每7次滑动展示一次插屏广告”的效果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:43:45