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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:26:00