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

基于SliderLayout实现滚动20次后展示Interstitial广告的问题

实现图片滚动20次后展示Interstitial广告的正确姿势

嘿,我来帮你梳理清楚这个逻辑的实现步骤,按照下面的方式调整代码就能搞定啦:

1. 给轮播添加滑动监听,准确统计滚动次数

你的滑块库(比如SliderLayout)肯定提供了滑动回调接口,我们要在每次滚动完成并切换到新页面时递增计数器。如果是基于ViewPager的滑块,直接用OnPageChangeListener即可:

slider.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // 这个方法会在滚动过程中频繁触发,无需处理
    }

    @Override
    public void onPageSelected(int position) {
        // 每次切换到新页面,计数器+1
        count++;
        // 调用检查方法,判断是否触发广告展示
        checkAndShowAd();
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        // 可选:如果你只想统计用户手动滑动的次数,可在这里判断状态
        // 比如仅当state == ViewPager.SCROLL_STATE_DRAGGING(用户开始拖动)时才计数,跳过自动轮播的情况
    }
});

如果你的滑块不是ViewPager体系,找到对应的「滚动完成/页面切换」回调方法即可,核心是确保每次有效滚动都能触发计数。

2. 抽离广告检查与展示的逻辑

把广告触发的逻辑单独写成方法,代码更清晰也更易维护:

private void checkAndShowAd() {
    // 两个核心判断:计数器达到20,且广告已加载完成
    if (count >= 20 && interstitial != null && interstitial.isLoaded()) {
        // 展示插屏广告
        interstitial.show(MainActivity.this);
        // 展示后重置计数器,避免重复触发
        count = 0;
        
        // 重要:广告展示后立即重新加载,保证下次触发时有可用广告
        interstitial.loadAd(adRequest);
    }
}

务必判断interstitial.isLoaded()!否则广告未就绪时调用show()会直接引发崩溃。

3. 正确初始化广告并监听状态

在onCreate中初始化广告时,记得预加载广告,并添加监听器处理加载失败、关闭等场景:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    
    // 先初始化轮播滑块,配置图片、适配器等内容
    slider = findViewById(R.id.slider);
    // ... 你的滑块初始化代码
    
    // 初始化插屏广告
    interstitial = new InterstitialAd(this);
    interstitial.setAdUnitId("你的广告单元ID");
    adRequest = new AdRequest.Builder().build();
    // 预加载第一波广告
    interstitial.loadAd(adRequest);
    
    // 给广告添加状态监听器,处理各种场景
    interstitial.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            // 广告加载完成的回调,可做日志标记或状态更新
        }

        @Override
        public void onAdFailedToLoad(int errorCode) {
            // 加载失败时,重新尝试加载广告
            interstitial.loadAd(adRequest);
        }

        @Override
        public void onAdClosed() {
            // 用户关闭广告后,立即加载下一次的广告
            interstitial.loadAd(adRequest);
        }
    });
    
    // 最后添加上轮播的滑动监听器
    slider.addOnPageChangeListener(...); // 对应步骤1中的监听代码
}

4. 几个关键细节要注意

  • 计数器重置:广告展示后必须将count重置为0,否则后续滚动会立刻再次触发广告。
  • 广告重复加载:无论广告展示完成还是用户手动关闭,都要重新加载广告,确保下次触发时有可用资源。
  • 内存泄漏处理:在Activity的onDestroy方法中销毁广告,避免内存泄漏:
@Override
protected void onDestroy() {
    if (interstitial != null) {
        interstitial.destroy();
    }
    super.onDestroy();
}
  • 区分手动/自动滚动:如果你的轮播支持自动滚动,且只想统计用户手动滑动的次数,可在onPageScrollStateChanged中判断状态,仅在用户拖动时递增计数器。

这样调整后,就能准确实现滚动20次后展示插屏广告的需求,同时避免广告加载失败、重复触发等问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:34:53