AdMob横幅广告首次加载正常 重启应用/连WiFi时加载失败咨询
AdMob广告加载异常问题排查与修复方案
已确认的问题根因
- 广告初始化时机错误:你当前在
MobileAds.initialize的初始化回调还没执行完成时,就直接调用runnable.run()触发广告加载,首次启动可能初始化速度快刚好能完成,重启应用后AdMob缓存状态异常时就会加载失败 - Handler循环任务未做生命周期绑定:应用退到后台再重启时,之前的Handler定时任务没有销毁,重复的广告加载请求会触发AdMob的频率限制,直接返回加载失败
- 没有配置广告加载回调的错误处理:你当前没有监听广告加载失败的回调,无法区分是网络限制、广告填充不足还是SDK内部错误导致的加载失败,WiFi场景下加载失败大概率是当前WiFi对应的IP段被AdMob临时限制了广告填充
- 额外冗余问题:你代码里声明了
InterstitialAd变量但完全没有使用,横幅广告刷新频率设置为60秒,超出了AdMob官方建议的最优区间,容易触发频率限制
修复后的代码实现
public class MainActivity2 extends AppCompatActivity { private AdView adView; private AdView adView2; private Handler handler = new Handler(Looper.getMainLooper()); private Runnable adRefreshRunnable; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 提前初始化广告View adView = findViewById(R.id.adView); adView2 = findViewById(R.id.adView2); // 配置广告加载错误监听 adView.setAdListener(new AdListener() { @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { super.onAdFailedToLoad(loadAdError); // 加载失败后延迟10秒重试,避免频繁请求 handler.removeCallbacks(adRefreshRunnable); handler.postDelayed(adRefreshRunnable, 10000); } }); adView2.setAdListener(new AdListener() { @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { super.onAdFailedToLoad(loadAdError); handler.removeCallbacks(adRefreshRunnable); handler.postDelayed(adRefreshRunnable, 10000); } }); // 初始化MobileAds,完成后再触发广告加载 MobileAds.initialize(this, initializationStatus -> { Toast.makeText(getApplicationContext(), "广告SDK初始化成功", Toast.LENGTH_SHORT).show(); adRefreshRunnable = () -> { AdRequest adRequest = new AdRequest.Builder().build(); adView.loadAd(adRequest); adView2.loadAd(adRequest); Toast.makeText(getApplicationContext(), "广告已刷新", Toast.LENGTH_SHORT).show(); // 调整刷新间隔为45秒,符合官方最优建议 handler.postDelayed(adRefreshRunnable, 45000); }; adRefreshRunnable.run(); }); } @Override protected void onDestroy() { // 页面销毁时销毁广告View、取消定时任务,避免内存泄漏和重复请求 if (adView != null) adView.destroy(); if (adView2 != null) adView2.destroy(); if (handler != null) handler.removeCallbacks(adRefreshRunnable); super.onDestroy(); } @Override protected void onPause() { if (adView != null) adView.pause(); if (adView2 != null) adView2.pause(); super.onPause(); } @Override protected void onResume() { super.onResume(); if (adView != null) adView.resume(); if (adView2 != null) adView2.resume(); } }
附加优化建议
- 测试阶段使用AdMob官方提供的测试广告ID,不要使用正式ID,避免因为测试阶段无效请求太多导致账号被限制
- WiFi场景下加载失败如果持续出现,可以在广告加载失败回调里判断当前网络状态,自动触发1-2次重试,重试都失败后再等待下一个刷新周期
- 不要在广告还没加载完成时重复调用
loadAd方法,会导致之前的请求被废弃,增加加载失败概率
内容的提问来源于stack exchange,提问作者Ghosty Gigabytes
相关产品推荐
相关产品推荐

