广告加载失败时用递归重试加载Admob插屏广告是否为良好实践?
Admob插屏广告重试策略的合理性分析与优化建议
你最开始的无限递归重试确实是不良实践,核心问题有两点:
- 广告持续加载失败时,会短时间内发起大量网络请求,既消耗用户流量、占用设备CPU/内存资源,还可能触发AdMob的请求频率限制,导致后续正常请求被限流。
- 递归调用会不断生成
InterstitialAdLoadCallback实例,若Activity发生生命周期变化(比如用户切出App),很容易引发内存泄漏。
你的优化方向是正确的,下面逐一分析各版本代码:
初始代码(存在风险)
@Override protected void onResume() { super.onResume(); CallNewInertial(); } private void CallNewInertial() { ConnectionDetector cd = new ConnectionDetector(Activityone.this); if (cd.isConnectingToInternet()) { requestNewInterstitial(); } } private void requestNewInterstitial() { AdRequest adRequest = new AdRequest.Builder().build(); InterstitialAd.load(Activityone.this, getString(R.string.interid), adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { mInterstitialAd = null; requestNewInterstitial(); } }); } btnPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mInterstitialAd != null) { mInterstitialAd.show(Activityone.this); mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { } }); } } });
优化代码1:限制重试次数
这一步解决了无限递归的核心问题,通过maxRetry参数控制重试上限,避免无限制请求。建议将重试次数维持在3-5次,平衡广告加载成功率和资源消耗。
@Override protected void onResume() { super.onResume(); requestNewInterstitial(5); } private void requestNewInterstitial(int maxRetry) { AdRequest adRequest = new AdRequest.Builder().build(); InterstitialAd.load(Activityone.this, getString(R.string.interid), adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { if (maxRetry > 0) { mInterstitialAd = null; requestNewInterstitial(maxRetry - 1); } } }); } btnPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mInterstitialAd != null) { mInterstitialAd.show(Activityone.this); mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { } }); } } });
优化代码2:加入延迟重试
在限制重试次数的基础上加入延迟,是更合理的策略。广告加载失败多为临时问题(如网络波动、AdMob服务器临时拥堵),间隔10秒重试能提升成功率,同时避免短时间内大量请求。
@Override protected void onResume() { super.onResume(); requestNewInterstitial(5); } private void requestNewInterstitial(int maxRetry) { AdRequest adRequest = new AdRequest.Builder().build(); InterstitialAd.load(Activityone.this, getString(R.string.interid), adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { if (maxRetry > 0) { new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { mInterstitialAd = null; requestNewInterstitial(maxRetry - 1); } // 10秒延迟 }, 10000); } } }); } btnPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mInterstitialAd != null) { mInterstitialAd.show(Activityone.this); mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { } }); } } });
额外优化建议
- 恢复网络检查:初始代码中的
ConnectionDetector很实用,建议在发起广告请求前先判断网络状态,无网络时直接停止重试,等网络恢复后再重新触发请求(可通过监听网络变化广播实现)。 - 生命周期适配:在Activity的
onDestroy方法中,清理Handler的延迟任务和广告实例,避免内存泄漏;同时在onAdDismissedFullScreenContent回调中重新加载广告,确保下次需要展示时有可用的广告资源。 - 错误码针对性处理:根据
LoadAdError的错误码做差异化处理,比如ERROR_CODE_NO_FILL(无广告填充)时无需重试,直接停止;只有网络错误、服务器错误等临时问题才进行重试。
内容的提问来源于stack exchange,提问作者Eldestornillador
相关产品推荐
相关产品推荐

