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

Android WebView实现每30秒定时展示AdMob插屏广告问题

Android WebView中实现AdMob插屏广告每隔30秒自动展示

现有代码的问题

你的代码仅在应用启动时加载并展示一次插屏广告,没有实现循环加载+定时触发的逻辑,广告展示完成后也没有重新加载下一个广告,所以后续不会再出现广告。另外,你找到的旧代码使用了已废弃的AdListener接口,不符合AdMob当前的API规范,无法直接使用。

解决方案步骤

  1. 定义全局成员变量:将插屏广告实例、Handler和定时任务Runnable设为Activity的全局变量,方便在回调中访问和重复调用。
  2. 实现定时循环逻辑:广告展示完成或展示失败后,启动30秒定时任务,到点后重新加载新的插屏广告。
  3. 使用新版回调接口:改用AdMob推荐的FullScreenContentCallback处理广告生命周期事件,替代已废弃的AdListener。

修改后的完整代码

public class MainActivity extends AppCompatActivity {
    // 全局变量
    private InterstitialAd mInterstitialAd;
    private Handler mHandler;
    private Runnable mAdLoadRunnable;
    private static final long AD_INTERVAL = 30000; // 30秒间隔
    private static final String AD_UNIT_ID = "ca-app-pub-123256789123456/1234567890";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化AdMob
        MobileAds.initialize(this, initializationStatus -> {});

        // 初始化Handler和定时任务
        mHandler = new Handler(Looper.getMainLooper());
        mAdLoadRunnable = this::loadInterstitialAd;

        // 启动第一次广告加载
        mHandler.post(mAdLoadRunnable);
    }

    // 加载插屏广告的方法
    private void loadInterstitialAd() {
        AdRequest adRequest = new AdRequest.Builder().build();
        InterstitialAd.load(this, AD_UNIT_ID, adRequest, new InterstitialAdLoadCallback() {
            @Override
            public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                mInterstitialAd = interstitialAd;
                // 广告加载成功后立即展示
                showInterstitialAd();
            }

            @Override
            public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                mInterstitialAd = null;
                // 加载失败,30秒后重试
                mHandler.postDelayed(mAdLoadRunnable, AD_INTERVAL);
            }
        });
    }

    // 展示插屏广告的方法
    private void showInterstitialAd() {
        if (mInterstitialAd != null) {
            mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                @Override
                public void onAdDismissedFullScreenContent() {
                    super.onAdDismissedFullScreenContent();
                    mInterstitialAd = null;
                    // 广告关闭后,30秒后加载下一个广告
                    mHandler.postDelayed(mAdLoadRunnable, AD_INTERVAL);
                }

                @Override
                public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                    super.onAdFailedToShowFullScreenContent(adError);
                    mInterstitialAd = null;
                    // 展示失败,30秒后加载下一个广告
                    mHandler.postDelayed(mAdLoadRunnable, AD_INTERVAL);
                }
            });
            mInterstitialAd.show(MainActivity.this);
        } else {
            // 当前没有可用广告,立即加载下一个
            mHandler.post(mAdLoadRunnable);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 页面销毁时移除定时任务,避免内存泄漏
        if (mHandler != null && mAdLoadRunnable != null) {
            mHandler.removeCallbacks(mAdLoadRunnable);
        }
    }
}

关键逻辑说明

  • 全局变量:mInterstitialAd保存当前加载完成的广告实例,mHandler和mAdLoadRunnable负责定时触发广告加载。
  • 循环加载:无论广告展示成功、失败还是被关闭,都会在30秒后重新调用loadInterstitialAd()加载新广告。
  • 内存泄漏防护:在onDestroy()中移除Handler的回调,避免Activity销毁后定时任务仍在运行。
  • 旧代码适配:你找到的代码使用的AdListener已被AdMob废弃,当前版本必须使用FullScreenContentCallback处理广告的展示、关闭、失败等事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:52:41