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

Android端如何处理AdMob的onAdFailedToLoad回调解决弹窗无限加载问题

解决方案

问题根因

  • 你目前只在广告加载成功的onAdLoaded回调中关闭了加载弹窗,加载失败的onAdFailedToLoad回调中没有对应的关闭逻辑,因此网络异常、广告填充不足等场景下弹窗会永久展示
  • 现有逻辑存在时序问题:点击按钮后直接触发了休息/跳过休息的业务逻辑,和广告加载流程并行,不符合插屏广告的常规交互逻辑(用户看完广告再进入对应功能)

具体修改方案

1. 补全onAdFailedToLoad的处理逻辑

在广告加载失败回调中关闭弹窗,同时直接执行业务兜底逻辑,保证用户操作不会被阻断

2. 调整业务逻辑触发时序

将原来点击按钮时直接执行的业务逻辑,调整到广告关闭回调、以及广告加载失败的场景中触发

3. 可选优化

  • 增加网络预判断:无网时直接跳过广告流程,避免用户无意义等待
  • 去掉2秒加载延迟:减少用户点击后的等待时长
  • 提前预加载广告:可以在页面初始化时就加载好插屏广告,用户点击时直接展示,进一步提升体验

修改后的参考代码

首先定义操作类型变量,统一处理业务逻辑:

// 存储用户点击的按钮对应的操作类型,1=短休息,2=长休息,3=跳过休息
private int currentAdActionType = 0;

// 统一执行业务逻辑的方法
private void executeUserAction() {
    switch (currentAdActionType) {
        case 1:
            start_Break_From_Alert_Popup(start_short_break.getText().toString());
            break;
        case 2:
            start_Break_From_Alert_Popup(start_long_break.getText().toString());
            break;
        case 3:
            sessionCancel(HomeActivity.this, preferences);
            break;
    }
    currentAdActionType = 0;
}

// 网络判断工具方法,不需要可以直接删除
private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

修改广告初始化方法,补全失败和广告关闭回调:

private void init_Interstitial_ads() {
    InterstitialAd.load(this, "ca-app-pub-9852745157515787/5999732991", adRequest,
            new InterstitialAdLoadCallback() {
                @Override
                public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                    mInterstitialAd = interstitialAd;
                    // 加载成功先关闭加载弹窗
                    loadingDialog.dismiss_loadingDialog();
                    // 设置广告展示相关回调
                    mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback(){
                        @Override
                        public void onAdDismissedFullScreenContent() {
                            // 用户关闭广告后执行业务逻辑
                            executeUserAction();
                            mInterstitialAd = null;
                        }

                        @Override
                        public void onAdFailedToShowFullScreenContent(AdError adError) {
                            // 广告展示失败也正常执行业务逻辑
                            mInterstitialAd = null;
                            executeUserAction();
                        }
                    });
                    mInterstitialAd.show(HomeActivity.this);
                }

                @Override
                public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                    mInterstitialAd = null;
                    // 加载失败关闭弹窗,直接执行业务逻辑
                    loadingDialog.dismiss_loadingDialog();
                    executeUserAction();
                }
            });
}

修改广告触发方法,增加网络判断:

void userAdPromt() {
    // 无网直接走兜底逻辑,不需要加载广告
    if(!isNetworkAvailable()) {
        loadingDialog.dismiss_loadingDialog();
        executeUserAction();
        return;
    }
    // 如果觉得2秒等待太长可以直接去掉延迟,直接调用init_Interstitial_ads()
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            init_Interstitial_ads();
        }
    }, 2000);
}

修改三个按钮的点击逻辑,仅标记操作类型,不直接执行业务逻辑:

start_short_break.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        loadingDialog.start_loadingDialog();
        currentAdActionType = 1;
        userAdPromt();
    }
});

start_long_break.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        loadingDialog.start_loadingDialog();
        currentAdActionType = 2;
        userAdPromt();
    }
});

skipBreakSmallButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        loadingDialog.start_loadingDialog();
        currentAdActionType = 3;
        userAdPromt();
    }
});

如果使用了上面的网络判断方法,需要在AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

内容的提问来源于stack exchange,提问作者Ishtiaq Ali Chughtai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:27:02