Android端Admob联网后未触发onAdLoaded回调问题咨询
解决AdMob广告在网络恢复后不加载的问题
这个问题我做AdMob集成的时候也踩过坑,核心原因是AdMob的初始广告请求在无网络时失败后,不会自动监听网络状态变化来重试请求,得我们手动补上这个逻辑。下面给你几个可行的解决方案:
方案一:监听网络连接状态,恢复网络时重新加载广告
从Android 7.0开始,官方推荐用ConnectivityManager.NetworkCallback监听网络状态,比传统广播接收器更高效。示例代码如下:
private lateinit var networkCallback: ConnectivityManager.NetworkCallback private var isAdLoaded = false // 标记广告是否已加载,避免重复请求 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化你的广告视图等逻辑... setupNetworkListener() // 先尝试一次加载(不管当前网络状态) loadAdmobAd() } private fun setupNetworkListener() { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { // 网络恢复时,若广告未加载则重新请求 runOnUiThread { if (!isAdLoaded) { loadAdmobAd() } } } } val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build() connectivityManager.registerNetworkCallback(networkRequest, networkCallback) } private fun loadAdmobAd() { val adRequest = AdRequest.Builder().build() yourAdView.loadAd(adRequest) } override fun onAdLoaded() { super.onAdLoaded() isAdLoaded = true } override fun onDestroy() { super.onDestroy() // 记得注销回调,避免内存泄漏 val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager connectivityManager.unregisterNetworkCallback(networkCallback) }
还要记得在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
方案二:在广告加载失败回调中实现指数退避重试
如果不想监听全局网络状态,也可以在onAdFailedToLoad回调里判断错误类型,针对网络错误进行重试,用指数退避的方式避免频繁请求:
private var retryCount = 0 private val MAX_RETRY_TIMES = 5 override fun onAdFailedToLoad(loadAdError: LoadAdError) { super.onAdFailedToLoad(loadAdError) // 判断是否为网络相关错误 if (loadAdError.code == AdRequest.ERROR_CODE_NETWORK_ERROR && retryCount < MAX_RETRY_TIMES) { retryCount++ // 指数退避:1s、2s、4s... val delayMillis = Math.pow(2.0, retryCount.toDouble()).toLong() * 1000 Handler(Looper.getMainLooper()).postDelayed({ loadAdmobAd() }, delayMillis) } }
方案三:检查AdMob SDK版本与基础配置
有时候旧版本SDK的自动重试机制可能存在问题,建议先确认:
- 升级到最新版的AdMob SDK,比如在
build.gradle中更新:implementation 'com.google.android.gms:play-services-ads:22.6.0' // 替换为当前最新版本 - 确认你的广告单元ID有效,没有被AdMob后台禁用;
- 测试时用官方提供的测试广告ID(比如横幅广告测试ID:
ca-app-pub-3940256099942544/6300978111),避免触发流量限制。
额外小建议
- 可以在界面上添加一个弱提示,比如“网络恢复后将自动加载广告”,提升用户体验;
- 不要在应用启动瞬间就发起广告请求,可先判断当前网络状态,无网时延迟到网络恢复后再请求。
内容的提问来源于stack exchange,提问作者Rahul Bhavani
相关产品推荐
相关产品推荐

