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

广告加载失败时用递归重试加载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) {
                }
            });
        }
    }
});

额外优化建议

  1. 恢复网络检查:初始代码中的ConnectionDetector很实用,建议在发起广告请求前先判断网络状态,无网络时直接停止重试,等网络恢复后再重新触发请求(可通过监听网络变化广播实现)。
  2. 生命周期适配:在Activity的onDestroy方法中,清理Handler的延迟任务和广告实例,避免内存泄漏;同时在onAdDismissedFullScreenContent回调中重新加载广告,确保下次需要展示时有可用的广告资源。
  3. 错误码针对性处理:根据LoadAdError的错误码做差异化处理,比如ERROR_CODE_NO_FILL(无广告填充)时无需重试,直接停止;只有网络错误、服务器错误等临时问题才进行重试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:52:07