Android WebView实现每30秒定时展示AdMob插屏广告问题
Android WebView中实现AdMob插屏广告每隔30秒自动展示
现有代码的问题
你的代码仅在应用启动时加载并展示一次插屏广告,没有实现循环加载+定时触发的逻辑,广告展示完成后也没有重新加载下一个广告,所以后续不会再出现广告。另外,你找到的旧代码使用了已废弃的AdListener接口,不符合AdMob当前的API规范,无法直接使用。
解决方案步骤
- 定义全局成员变量:将插屏广告实例、Handler和定时任务Runnable设为Activity的全局变量,方便在回调中访问和重复调用。
- 实现定时循环逻辑:广告展示完成或展示失败后,启动30秒定时任务,到点后重新加载新的插屏广告。
- 使用新版回调接口:改用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
相关产品推荐
相关产品推荐

